BG:2月底开始找实习,无奈算法薄弱,项目不熟。实习惨败,一转眼到六月份。准备秋招前的两个月的积累。重点强化下算法,害怕自己每天忘记刷题,于是报了卡哥的算法训练营。共计60天,希望自己加油!个人公众号:TccodeT
Day1[6.21]
1.二分查找[易]
2.移除元素[仔细看题呢]
这个题目没做好的话,大概是没有理解题目的意思,我开始就没看懂。我们只需要关注与
val值不同的数并放置在数组的前K个位置
,其余的数是什么无所谓法一:双向指针
int i=0,j=n; while(i<j){ //左指针如果为val,则把右边的数赋值给他,如果右边==val,继续,不等于就left++;很明显的覆盖操作 if(nums[i]==val){ nums[i]=nums[j-1]; j--; }else{ i++; } } return i;
法二:快慢指针
//这类你追我赶的样子也很巧妙的 for(int r=0;r<n;r++){ if(nums[r]==val){ continue; }else{ nums[l++]=nums[r]; } }
Day2[6.22]
1.有序数组的平方[双指针]
2.长度最小的子数组[滑动窗口]
滑动窗口也是很棒的一种思路哟
class Solution { public int minSubArrayLen(int s, int[] nums) { int n = nums.length; if (n == 0) { return 0; } int ans = Integer.MAX_VALUE; int start = 0, end = 0; int sum = 0; //右指针先不断试探 while (end < n) { sum += nums[end]; //当满足添加时,记录结果,并不断收缩左边界直到再次不满足条件 while (sum >= s) { ans = Math.min(ans, end - start + 1); sum -= nums[start]; start++; } end++; } return ans == Integer.MAX_VALUE ? 0 : ans; } }
补充:我们可以再看一道题目,相信结合起来看对滑动窗口的适用时机会更加的清晰
904水果成篮:. - 力扣(LeetCode)
题目大意就是只能选取两种类型的连续数字,看最多子数组的长度有多少。
滑动窗口:窗口中有限制条件:
种类,还是数组和等等
,通过这个限制条件来进行收缩,并且前提是——连续
所以:滑动窗口=连续子数组/子串+限制条件
3.螺旋矩阵[固定方法]
学习的是leetcodeK神代码:. - 力扣(LeetCode),真的很清晰。
固定四个参数:top,bottom,left,right
while(true){
沿四个方向进行模拟:
1.➡️遍历完top++,表示下一次这个方向的时候降低一行[if(top>bottom)退出]
2.⬇️遍历完right--,表示下一次这个方向的时候左移一行[if(right<left)退出]
3.⬅️遍历完bottom--,表示下一次这个方向的时候升高一行[if(top>bottom)退出]
4.⬆️遍历完left++,表示下一次这个方向的时候右移一行[if(right<left)退出]
}
后记:补充一张关于双指针的图,个人感觉非常形象,取自Leetcode某大佬[地址]