数组
1、二分法
那之后在判断target和我们数组中的num [ mid ] 大小关系之后,再重新调整right,以及left的时候,应该是left = mid + 1,right = mid - 1
- while (left <= right) 要使⽤ <= ,因为left == right是有意义的
- 所以使⽤ <= if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]⼀定不是target,那么接 下来要查找的左区间结束下标位置就是 middle - 1
2、移除元素(双指针-同向)
除了可以暴力两层循环这么去从后往前覆盖,从而消除掉目标元素
还可以使用双指针法:快慢指针(重点是理解快慢指针什么含义)!!!!!!!!
int slow = 0;
for(int fast = 0; fast < nums.length; fast++){
if(nums[fast] != target){
nums[slow++] = nums[fast];
}
}
3、有序数组的平方(双指针-相向)
题目需求:一个有序数组,存在有负数,所有元素依次取平方要求最后还是有序
根据题意可以知道,最大值肯定出现在数组的左右两侧
所以还是想到用双指针的思路,两个指针分别指向数组的开头和结尾,然后向中间移动
符合条件的放进新的数组中
public int[] sortedSquares(int[] nums) {
int k = nums.length - 1;
int[] res = new int[k+1];
for(int i=0,j=k; i<=j; ){
if(nums[i]*nums[i] > nums[j]*nums[j]){
res[k--] = nums[i] * nums[i];
i++;
}
else {
res[k--] = nums[j] * nums[j];
j--;
}
}
return res;
}
4、⻓度最⼩的⼦数组(滑动窗口)
除了暴力解决,还有滑动窗口思路
其实也就是双指针的思路,不过是取两个指针中间的一个集合,像是一个滑动的窗口
最后目标的长度就是:指针2 - 指针1 + 1
然后需要明确一下两个指针的含义:
- 指针1:for循环里面的指针 j ,这个是指向这个区间的终止位置的,我们的目标是通过对开始位置 指针i 进行操作然后更新最小长度
- 指针2:这个用来标记开始位置,和指针1结合使用
1、窗⼝的起始位置如何移动:如果当前窗⼝的值⼤于s了,窗⼝就要向前移动了(也就是该缩⼩了)。
2、**窗⼝的结束位置如何移动:**窗⼝的结束位置就是遍历数组的指针,也就是for循环⾥的索引。
解题的关键在于 窗⼝的起始位置如何移动,相当于是sum一边吐出之前区间中最开始的数据,然后再加上一下个数据,之后再利用标记开始位置的指针2,再取判断
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i = 0;
int sum = 0;
int minLen = Integer.MAX_VALUE;
for(int j = 0; j < nums.length; j++){
sum += nums[j];
while(sum >= target){
int len = j - i + 1;
minLen = Math.min(minLen,len);
sum -= nums[i];
i++;
}
}
return minLen == Integer.MAX_VALUE ? 0 : minLen;
}
}
5、螺旋矩阵II (知道思路即可,有空再练代码)
⾯试中出现频率较⾼的题⽬,本题并不涉及到什么算法,就是模拟过程,但却⼗分考察对代码的 掌控能⼒。
这里容易遇到的问题是:
就是因为在画每⼀条边的时候,⼀会左开右闭,⼀会左闭右闭,⼀会⼜来左闭右开,岂能不乱。
比如第一次是1、2、3,第二次遍历第二条边又成了4、5,不包含起始节点了,这样就很乱,肯定会出问题
int[][] res = new int[n][n];
int startx = 0, starty = 0;
int loop = n / 2;
int mid = n / 2;
int count = 1;
int offset = 1;
int i,j;
while (loop > 0) {
i = startx;
j = starty;
for (j = starty; j < n - offset; j++) {
res[startx][j] = count++;
}
for (i = startx; i < n - offset; i++) {
res[i][j] = count++;
}
for (; j > starty; j--) {
res[i][j] = count++;
}
for (; i > startx; i--) {
res[i][j] = count++;
}
startx++;
starty++;
offset += 1;
loop--;
}
if (n % 2 != 0) {
res[mid][mid] = count;
}
return res;
注:本篇是跟着代码随想录刷题练习,不过是自己的刷题总结,使用的刷题语言是Java