摘要:
题目链接 解题思路: 方法一:两个for循环,时间复杂度:O(n^2) 方法二:先排序,然后双指针,时间复杂度:O(n * logn) 方法三:使用一个set,从左往右遍历,每次遍历到一个数num,先查找set,是否存在target - num的数,如果存在,直接返回了。时间复杂度:O(n)。 因为 阅读全文
摘要:
题目链接 解题思路 从左往右的尝试,暴力递归(回溯),process(index, path),来到index,两种情况,要index的数,或者不要index的数 代码 class Solution { public: void process(vector<vector<int>> &ans, c 阅读全文
摘要:
题目链接 解题思路 求最小子串问题,第一时间,想「以i开头的结果是什么」,求出所有的结果,最优的便是;或者「以i结尾的结果是什么」,求出所有的结果,最优的便是 这个题使用「以i开头的结果是什么」,假设是[i, j]然后再求i+1的结果时,我们发现,只需要把i位置的字符去掉,就可以知道是否满足结果,如 阅读全文
摘要:
题目链接 这就是「荷兰国旗」问题,把颜色分成左边红色、中间白色、右边蓝色的顺序,实现快排的一部分步骤。 解题思路 我们可以有一个left_border变量,表示[0, left_border]都是红色,同时,一个right_border变量,[right_border, n - 1]都是蓝色,那么[ 阅读全文
摘要:
题目链接 本题使用的是快排解决。 思路:「荷兰国旗」问题,具体思路跳转75. 颜色分类 代码 class Solution { public: void swap(vector<int>& nums, int i, int j) { int tmp = nums[i]; nums[i] = nums 阅读全文
摘要:
题目链接 解题思路 直接暴力递归,process(i, j):word1[i...]转换成word2[j...]需要的最少操作次数,也就是说,i字符之前的不用处理了,已经变成了j字符之前的了。 如果word1[i] == word2[j] 可以什么操作都不干,i和j就完成了,所以返回process( 阅读全文
摘要:
题目链接 这道题目与62.不同路径很像,来到[i, j]位置,只能向下,或者向右走,只不过改题是要求总和最小。 process(i, j):当前在[i, j]位置,返回最小路径和 所以当在[i, j],如果还能往下走,一种答案就是process(i + 1, j) + grid[i][j] 如果还能 阅读全文