原地哈希——把数组本身当哈希表
LC41 要求 O(n) 时间 O(1) 空间找第一个缺失正整数,常规哈希表空间不够用。原地哈希的核心思路:数组本身就是一张哈希表,把每个数送回它该在的位置。
LC41 要求 O(n) 时间 O(1) 空间找第一个缺失正整数,常规哈希表空间不够用。原地哈希的核心思路:数组本身就是一张哈希表,把每个数送回它该在的位置。
209. 长度最小的子数组 链接:力扣209 文章:代码随想录 视频:B站讲解 状态:✅ 第一想法 看到这道题的第一想法是做一个前缀和,但是引入前缀和之后需要去减去之后恰好小于target的另一个前缀和,遍历的话复杂度就会变成 $O(n^2)$ ,然后想到了可以二分查找; 但是仔细思考一下就会发现,可以维护一个队列,不断把数据push进去,一旦找到大于target的就开始把前面的数据踢出去,直到再次小于target;这样就不需要复杂的查找了; 看完题解后的想法 队列在这里其实就是一个双指针维护的滑动窗口; 实现中遇到的困难 result需要判断当前窗口大小和历史result谁更小,使用双指针滑动窗口不会有问题,但是如果是用队列来维护滑动窗口,需要使用queue.size(),返回的类型是size_t,需要强制转换成int; 一开始还给result直接赋值0,但是这样在min里会锁死最小值; 代码 class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int sum = 0; int result = INT_MAX; int left = 0; for (int right = 0; right < nums.size(); right++) { sum += nums[right]; while (sum >= target) { result = min(result, right-left+1); sum = sum - nums[left]; left++; } } return result == INT_MAX ? 0 : result;; } }; 59. 螺旋矩阵II 链接:力扣59 文章:代码随想录 视频:B站讲解 状态:❌ 第一想法 看完题目的第一想法就是如何移动坐标去填充数据,然后就被边界条件卡住了; ...
704. 二分查找 链接:力扣704 文章:代码随想录 视频:B站讲解 状态:✅ 第一想法 二分查找母题; 有闭区间和开区间两种解法: 闭区间:right 初始化为 nums.size()-1 ,是实右边界;在进入 while 循环时就要注意需要判断 left == right;同时每次移动边界都要从已经找到的地方往右或往左移动一步; 开区间:right 初始化为 nums.size() ,是虚右边界;在进入 while 循环时就要注意写 left < right;移动时左边界是 mid+1, 而右边界是 mid; 看完题解后的想法 —— 实现中遇到的困难 采用实变界进入循环的判断忘记了需要判断left == right; 代码 class Solution { public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size()-1; while (left <= right) { int mid = left + (right-left)/2; if (nums[mid] == target) { return mid; } else if (nums[mid] > target) { right = mid-1; } else { left = mid+1; } } return -1; } }; 27. 移除元素 链接:力扣27 文章:代码随想录 视频:B站讲解 状态:⚠️ 第一想法 第一想法就是维护两个指针,left 找到 val 位置,而 right 从右边找不为val的值,当左右相遇说明找完了; ...