
leetcode
虾球xz
光说不练假把式
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
leetcode笔记
leetcode原创 2022-10-06 16:40:54 · 297 阅读 · 0 评论 -
leetcode -[43. 字符串相乘]
leetcode -[43. 字符串相乘]题目大意给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。解题思路用数组模拟乘法。创建一个数组长度为 len(num1) + len(num2) 的数组用于存储乘积。对于任意 0 ≤ i < len(num1),0 ≤ j < len(num2),num1[i] * num2[j] 的结果位于 tmp[i+j+1],如果 tmp[i+j+1]≥10,则将进位部分加到原创 2021-08-18 11:58:21 · 157 阅读 · 0 评论 -
leetcode -[42. 接雨水]
leetcode -[42. 接雨水]题目大意从 x 轴开始,给出一个数组,数组里面的数字代表从 (0,0) 点开始,宽度为 1 个单位,高度为数组元素的值。如果下雨了,问这样一个容器能装多少单位的水?解题思路每个数组里面的元素值可以想象成一个左右都有壁的圆柱筒。例如下图中左边的第二个元素 1,当前左边最大的元素是 2 ,所以 2 高度的水会装到 1 的上面(因为想象成了左右都有筒壁)。这道题的思路就是左指针从 0 开始往右扫,右指针从最右边开始往左扫。额外还需要 2 个变量分别记住左边最大的高度原创 2021-08-18 11:49:44 · 173 阅读 · 0 评论 -
leetcode -[41. 缺失的第一个正数]
leetcode -[41. 缺失的第一个正数]题目大意找到缺失的第一个正整数。解题思路为了减少时间复杂度,可以把 input 数组都装到 map 中,然后 i 循环从 1 开始,依次比对 map 中是否存在 i,只要不存在 i 就立即返回结果,即所求将所有数字放入map中。对数组中的每个数 a[i],在映射中删除其连续数2.1) 删除… a[i]-3, a[i]-2, a[i]-1, a[i]2.2) 删除 a[i]+1, a[i]+2, a[i]+3,…在删除过程原创 2021-08-18 11:36:15 · 153 阅读 · 0 评论 -
leetcode -[39. 组合总和]
leetcode -[39. 组合总和]题目大意给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。Input: candidates = [2,3,5], target = 8,A solution set is:[ [2,2,2,2], [2,3,3], [3,5]]解题思路题目要求出总和为 sum 的所有组合,组合需要去重原创 2021-08-18 11:15:59 · 132 阅读 · 0 评论 -
leetcode - [38. 外观数列]
leetcode - [38. 外观数列]count-and-say 序列是如下开始的整数序列:1, 11, 21, 1211, 111221, …1 读作“一 1”或 11。11 读作“两个 1”或 21。21 读作“一 2,然后一 1”或 1211。给定一个整数 n,生成第 n 个序列。注意:整数序列将表示为字符串。示例 1:输入:n = 1输出:“1”解释:这是一个基本样例。示例 2:输入:n = 4输出:“1211”#include <stdlib.h>原创 2021-08-18 10:47:19 · 162 阅读 · 0 评论 -
leetcode - [37. 解数独]
leetcode - [37. 解数独]题目大意编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。解题思路给出一个数独谜题,要求解出这个数独解题思路 DFS 暴力回溯枚举。数独要求每横行,每竖行,每九宫格内,1-9 的数字不能重复,每次放下一个数字的时候,在这 3 个地方都需要判断一次。另外找到一组原创 2021-08-18 10:18:16 · 171 阅读 · 0 评论 -
leetcode - [36. 有效的数独]
leetcode - [36. 有效的数独]题目大意判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。解题思路给出一个数独的棋盘,要求判断这个棋盘当前是否满足数独的要求:即行列是否都只包含 1-9,每个九宫格里面是否也只包含 1-9 。注意这题和第 37 题是不同的,这一题是判断当前棋盘状态是否满足数独的要求,而第 3原创 2021-08-18 09:44:46 · 180 阅读 · 0 评论 -
leetcode - [34. 在排序数组中查找元素的第一个和最后一个位置] ##
leetcode - [34. 在排序数组中查找元素的第一个和最后一个位置]题目大意给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。解题思路给出一个有序数组 nums 和一个数 target,要求在数组中找到第一个和这个元素相等的元素下标,最后一个和这个元素相等的元素下标。这一题是经典的二分搜索变种题。二分搜索有 4 大基础变种题:原创 2021-08-17 19:24:52 · 159 阅读 · 0 评论 -
leetcode - [35. 搜索插入位置]
leetcode - [35. 搜索插入位置]题目大意给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。解题思路给出一个已经从小到大排序后的数组,要求在数组中找到插入 target 元素的位置。这一题是经典的二分搜索的变种题,在有序数组中找到最后一个比 target 小的元素。#include <stdio.h>int binary_search(int A[], int n,原创 2021-08-17 18:58:29 · 133 阅读 · 0 评论 -
leetcode - [32. 最长有效括号]
leetcode - [32. 最长有效括号]题目大意给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。解题思路提到括号匹配,第一时间能让人想到的就是利用栈。这里需要计算嵌套括号的总长度,所以栈里面不能单纯的存左括号,而应该存左括号在原字符串的下标,这样通过下标相减可以获取长度。那么栈如果是非空,栈底永远存的是当前遍历过的字符串中上一个没有被匹配的右括号的下标。上一个没有被匹配的右括号的下标可以理解为每段括号匹配之间的“隔板”。例如,())((())),原创 2021-08-17 17:07:07 · 322 阅读 · 0 评论 -
leetcode - [31. 下一个排列]
leetcode - [31. 下一个排列]题目大意实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。解题思路题目有 3 个问题需要解决。如何找到下一个排列。不存在下一个排列的时候如何生成最小的排列。如何原地修改。先解决第一个问题,如何找到下一个排列。下一个排列是找到一个大于当前排序的字典序,且变大的幅度最小。那么只能将较小的数与较大数做一次原地原创 2021-08-17 16:38:43 · 109 阅读 · 0 评论 -
leetcode - [30. 串联所有单词的子串]
leetcode - [30. 串联所有单词的子串]题目大意给定一个源字符串 s,再给一个字符串数组,要求在源字符串中找到由字符串数组各种组合组成的连续串的起始下标,如果存在多个,在结果中都需要输出。解题思路这一题看似很难,但是有 2 个限定条件也导致这题不是特别难。1. 字符串数组里面的字符串长度都是一样的。2. 要求字符串数组中的字符串都要连续连在一起的,前后顺序可以是任意排列组合。解题思路,先将字符串数组里面的所有字符串都存到 map 中,并累计出现的次数。然后从源字符串从头开始扫,每次判断原创 2021-08-17 16:26:01 · 274 阅读 · 0 评论 -
leetcode - [29. 两数相除]
leetcode - [29. 两数相除]题目大意给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。说明:被除数和除数均为 32 位有符号整数。除数不为 0。假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。本题中,如果除法结果溢出,则返回 2^31 − 1。解题思路给出除数和被除数,要求计算除法运算以后的商。注原创 2021-08-17 14:34:33 · 333 阅读 · 0 评论 -
eetcode - [27. 移除元素]
leetcode - [27. 移除元素]题目大意给定一个数组 nums 和一个数值 val,将数组中所有等于 val 的元素删除,并返回剩余的元素个数。解题思路这道题和第 283 题很像。这道题和第 283 题基本一致,283 题是删除 0,这一题是给定的一个 val,实质是一样的。这里数组的删除并不是真的删除,只是将删除的元素移动到数组后面的空间内,然后返回数组实际剩余的元素个数,OJ 最终判断题目的时候会读取数组剩余个数的元素进行输出。class Solution{ public:原创 2021-08-17 14:15:49 · 156 阅读 · 0 评论 -
leetcode - 26. 删除有序数组中的重复项
leetcode - 26. 删除有序数组中的重复项题目大意给定一个有序数组 nums,对数组中的元素进行去重,使得原数组中的每个元素只有一个。最后返回去重以后数组的长度值。解题思路这道题和第 27 题很像。这道题和第 283 题,第 27 题基本一致,283 题是删除 0,27 题是删除指定元素,这一题是删除重复元素,实质是一样的。这里数组的删除并不是真的删除,只是将删除的元素移动到数组后面的空间内,然后返回数组实际剩余的元素个数,OJ 最终判断题目的时候会读取数组剩余个数的元素进行输出。cl原创 2021-08-17 14:08:55 · 126 阅读 · 0 评论 -
leetcode - 25. K 个一组翻转链表
leetcode - 25. K 个一组翻转链表题目大意按照每 K 个元素翻转的方式翻转链表。如果不满足 K 个元素的就不翻转。解题思路这一题是 problem 24 的加强版,problem 24 是两两相邻的元素,翻转链表。而 problem 25 要求的是 k 个相邻的元素,翻转链表,problem 相当于是 k = 2 的特殊情况。#include <stdio.h>#include <stdlib.h>#include <iostream>usi原创 2021-08-17 14:03:41 · 91 阅读 · 0 评论 -
leetcode - 24. 两两交换链表中的节点 ##
leetcode - 24. 两两交换链表中的节点题目大意两两相邻的元素,翻转链表class Solution{ public: Solution() { srand(time(NULL)); } //这里我们有两种方法来解决这个问题: //1) 保持列表的节点不变。 只交换列表节点中的数据。 //2)物理交换列表节点。 ListNode *swapPairs(ListNode* head)原创 2021-08-17 13:47:42 · 89 阅读 · 0 评论 -
leetcode - 23. 合并K个升序链表
leetcode - 23. 合并K个升序链表合并 K 个有序链表解题思路借助分治的思想,把 K 个有序链表两两合并即可。相当于是第 21 题的加强版。#include <stdio.h>#include <stdlib.h>#include <time.h>#include <iostream>#include <vector>using namespace std;struct ListNode{ int va原创 2021-08-17 12:13:41 · 112 阅读 · 0 评论 -
leetcode - 22. 括号生成
leetcode - 22. 括号生成题目大意给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。解题思路这道题乍一看需要判断括号是否匹配的问题,如果真的判断了,那时间复杂度就到 O(n * 2^n)了,虽然也可以 AC,但是时间复杂度巨高。这道题实际上不需要判断括号是否匹配的问题。因为在 DFS 回溯的过程中,会让 ( 和 ) 成对的匹配上的。#include <stdlib.h>#include <iostream>#in原创 2021-08-17 11:15:44 · 151 阅读 · 0 评论 -
leetcode - 21. 合并两个有序链表
leetcode - 21. 合并两个有序链表题目大意合并 2 个有序链表class Solution{ public: ListNode* mergeTwoLists(ListNode* l1,ListNode* l2) { ListNode *newHead = new ListNode(-1); ListNode *temp = newHead; while(l1&&l2) {原创 2021-08-17 10:58:00 · 105 阅读 · 0 评论 -
leetcode - 20. 有效的括号
leetcode - 20. 有效的括号题目大意括号匹配问题。解题思路遇到左括号就进栈push,遇到右括号并且栈顶为与之对应的左括号,就把栈顶元素出栈。最后看栈里面还有没有其他元素,如果为空,即匹配。需要注意,空字符串是满足括号匹配的,即输出 true。#include <iostream>#include <string>#include <stack>using namespace std;bool isValid(string s){原创 2021-08-17 10:18:27 · 109 阅读 · 0 评论 -
leetcode - 19. 删除链表的倒数第 N 个结点
leetcode - 19. 删除链表的倒数第 N 个结点题目大意删除链表中倒数第 n 个结点。解题思路这道题比较简单,先循环一次拿到链表的总长度,然后循环到要删除的结点的前一个结点开始删除操作。需要注意的一个特例是,有可能要删除头结点,要单独处理。这道题有一种特别简单的解法。设置 2 个指针,一个指针距离前一个指针 n 个距离。同时移动 2 个指针,2 个指针都移动相同的距离。当一个指针移动到了终点,那么前一个指针就是倒数第 n 个节点了。class Solution{ public:原创 2021-08-17 10:03:29 · 110 阅读 · 0 评论 -
leetcode - 18. 四数之和
leetcode - 18. 四数之和题目大意给定一个数组,要求在这个数组中找出 4 个数之和为 0 的所有组合解题思路用 map 提前计算好任意 3 个数字之和,保存起来,可以将时间复杂度降到 O(n^3)。这一题比较麻烦的一点在于,最后输出解的时候,要求输出不重复的解。数组中同一个数字可能出现多次,同一个数字也可能使用多次,但是最后输出解的时候,不能重复。例如 [-1,1,2, -2] 和 [2, -1, -2, 1]、[-2, 2, -1, 1] 这 3 个解是重复的,即使 -1, -2 可能原创 2021-08-17 09:49:42 · 160 阅读 · 0 评论 -
leetcode - 17. 电话号码的字母组合
leetcode - 17. 电话号码的字母组合题目大意给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。解题思路DFS 递归深搜即可#include <iostream>#include <vector>#include <string>#include <algorithm>using namespace std;vector<strin原创 2021-08-17 09:22:04 · 123 阅读 · 0 评论 -
leetcode - 16. 最接近的三数之和
leetcode - 16. 最接近的三数之和题目大意给定一个数组,要求在这个数组中找出 3 个数之和离 target 最近。解题思路这一题看似和第 15 题和第 18 题很像,都是求 3 或者 4 个数之和的问题,但是这一题的做法和 15,18 题完全不同。这一题的解法是用两个指针夹逼的方法。先对数组进行排序,i 从头开始往后面扫。这里同样需要注意数组中存在多个重复数字的问题。具体处理方法很多,可以用 map 计数去重。这里笔者简单的处理,i 在循环的时候和前一个数进行比较,如果相等,i 继续往原创 2021-08-17 08:44:03 · 163 阅读 · 0 评论 -
leetcode - 15. 三数之和
题目大意给定一个数组,要求在这个数组中找出 3 个数之和为 0 的所有组合解题思路用 map 提前计算好任意 2 个数字之和,保存起来,可以将时间复杂度降到 O(n^2)。这一题比较麻烦的一点在于,最后输出解的时候,要求输出不重复的解。数组中同一个数字可能出现多次,同一个数字也可能使用多次,但是最后输出解的时候,不能重复。例如 [-1,-1,2] 和 [2, -1, -1]、[-1, 2, -1] 这 3 个解是重复的,即使 -1 可能出现 100 次,每次使用的 -1 的数组下标都是不同的。这里就原创 2021-08-17 08:23:15 · 192 阅读 · 0 评论 -
leetcode - 14. 最长公共前缀
leetcode - 14. 最长公共前缀题目大意编写一个函数来查找字符串数组中最长的公共前缀字符串解题思路先取出第一个字符串的子串,其他字符串挨着和他比较#include <iostream>#include <string>#include <vector>using namespace std;string longestCommonPrefix(vector<string> &strs){ string word;原创 2021-08-17 07:48:56 · 115 阅读 · 0 评论 -
leetcode - 13. 罗马数字转整数
题目大意罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。原创 2021-08-16 23:51:54 · 149 阅读 · 0 评论 -
leetcode - 12. 整数转罗马数字
leetcode - 12. 整数转罗马数字题目大意通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。C 可以放在 D (500) 和 M (1原创 2021-08-16 23:24:12 · 144 阅读 · 0 评论 -
leetcode 10 - 正则表达式匹配
正则表达式匹配题目大意给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。#include <stdio.h>#include <string.h>#include <iostream>using namespace std;bool isMatch(const char *s,cons原创 2021-08-16 23:01:55 · 96 阅读 · 0 评论 -
leetcode - 11 盛最多水的容器
题目大意给出一个非负整数数组 a1,a2,a3,…… an,每个整数标识一个竖立在坐标轴 x 位置的一堵高度为 ai 的墙,选择两堵墙,和 x 轴构成的容器可以容纳最多的水。解题思路这一题也是对撞指针的思路。首尾分别 2 个指针,每次移动以后都分别判断长宽的乘积是否最大。class Solution{ public: int maxArea(vector<int> &height) { int maxArea = 0;原创 2021-08-16 23:03:26 · 156 阅读 · 0 评论 -
leetcode - 0009. Palindrome Number
leetcode - 0009. Palindrome Number题目大意判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。解题思路判断一个整数是不是回文数。简单题。注意会有负数的情况,负数,个位数,10 都不是回文数。其他的整数再按照回文的规则判断。#include <stdio.h>#define INT_MIN (-2147483647 - 1)#define INT_MAX 2147483647class S原创 2021-08-16 22:28:38 · 138 阅读 · 0 评论 -
leetcode 8 - String to Integer (atoi)
leetcode 8 - String to Integer (atoi)题目大意请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的原创 2021-08-16 22:07:55 · 138 阅读 · 0 评论 -
leetcode 7 - Reverse Integer
leetcode 7 - Reverse Integer题目大意给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。解题思路这一题是简单题,要求反转 10 进制数。类似的题目有第 190 题。这一题只需要注意一点,反转以后的数字要求在 [−2^31, 2^31 − 1]范围内,超过这个范围的数字都要输出 0 。#in原创 2021-08-16 21:54:26 · 117 阅读 · 0 评论 -
leetcode 6 - ZigZag Conversion
题目大意将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:P A H NA P L S I I GY I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);解题思路这一题没有原创 2021-08-16 21:42:12 · 183 阅读 · 0 评论 -
leetcode 5 - longestPalindrome
给定一个字符串 S,找出 S 中最长的回文子串。你可以假设 S 的最大长度是 1000,并且存在一个唯一的最长回文子串。string longestPalindrome(string s){ string longest; int n = s.size(); if(n <= 1) return s; //构造一个矩阵,consdier matrix[i][j] as s[i] -> s[j] 是否为回文。 //使用char或int可能会导致`内存限制错误` //vector&原创 2021-08-16 15:33:19 · 187 阅读 · 0 评论 -
leetcode 4 - findMedianSortedArrays
有两个大小分别为 m 和 n 的排序数组 A 和 B。找出两个已排序数组的中位数。 整体运行时间复杂度应该是 O(log (m+n))。#include <stdio.h>int binarySearch(int A[],int low,int high,int key){ while(low <= high) { int mid = low + (high - low)/2; if(key == A[mid]) return mi原创 2021-08-16 15:15:57 · 247 阅读 · 0 评论 -
leetcode 3 - lengthOfLongestSubString
给定一个字符串,找出没有重复字符的最长子字符串的长度。例如,“abcabcbb”没有重复字母的最长子串是“abc”,其中长度为3。对于“bbbbb”,最长的子串是“b”,长度为1。主意:使用map存储每个字符的索引。因此,我们可以很容易地知道 when 重复和之前重复的 char 的索引。然后我们可以取出之前重复的字符,并继续跟踪最大长度。#include <string.h>#include <iostream>#include <string>#i.原创 2021-08-16 14:48:59 · 214 阅读 · 0 评论 -
leetcode 2 - ddTwoNumbers
给你两个链表,代表两个非负数。数字以相反的顺序存储,它们的每个节点都包含一个数字。将两个数字相加并作为链表返回。输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8单链表的定义。struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};class Soluti..原创 2021-08-16 14:26:23 · 117 阅读 · 0 评论