704 二分查找
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
这类问题的关键点在于,要注意到边界问题,一般处理方式为左闭右闭,或者左闭右开。
l 和 r 的+1 -1 也很重要
class Solution {
public int search(int[] nums, int target) {
int r=nums.length-1;
int l=0;
int mid=(r+l)/2;
while(l<= r){
if(nums[mid]== target) return mid;
else if(nums[mid]> target) r=mid-1;
else l=mid+1;
mid=(r+l)/2;
}
return -1;
}
}
27 移除元素
https://leetcode.cn/problems/remove-element/
要求原地修改数组
双指针的思路:快慢指针,快指针探索数组元素是否需要保留,如果要保留则赋值给慢指针
class Solution {
public int removeElement(int[] nums, int val) {
int l=0,n=nums.length;
for(int r=0;r<n;r++){
if(nums[r]!=val){
nums[l]=nums[r];
l++;
}
}
return l;
}
}
977 有序数组的平方
双指针思路,新创建一个result数组,,比较完之后放进去。因为两端是最大的,所以要从后往前放,先放大的。
class Solution {
public int[] sortedSquares(int[] nums) {
int l=0,n=nums.length;
int r=n-1;
int[] result= new int[n];
int i=n-1;
while(l<=r){
if(nums[l] * nums[l] > nums[r] * nums[r]){
result[i--]=nums[l]*nums[l];
l++;
}
else{
result[i--]=nums[r]*nums[r];
r--;
}
}
return result;
}
}
官方解题思路,使用了sort函数
class Solution {
public int[] sortedSquares(int[] nums) {
int[] ans = new int[nums.length];
for (int i = 0; i < nums.length; ++i) {
ans[i] = nums[i] * nums[i];
}
Arrays.sort(ans);
return ans;
}
}
209 长度最小的子数组
https://leetcode.cn/problems/minimum-size-subarray-sum/description/
滑动窗口,要注意还要缩到最小(左边)。
这个题目的子数组包含原数组,即最后结果可能为原先数组长度。加了一个变量t作为判断。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int l=0,n=nums.length,t=0;
int ans=n;
int sum=0;
for(int r=0;r<n;r++){
sum+=nums[r];
while(sum>=target){
t=1;
ans=Math.min(ans,r-l+1);
sum-=nums[l++];
}
}
if(ans==n&&t==0) ans=0;
return ans;
}
}
螺旋矩阵
循环不变量,一圈为一个大循环,然后再遍历四周。
class Solution {
public int[][] generateMatrix(int n) {
int[][] res=new int[n][n];
int startx=0,starty=0,count=1;
int t=1;//要减去的数
int mid=n/2;//中间位置
int loop=n/2;//循环次数
while(loop-->0){
int i=startx;
int j=starty;
for(j=starty;j<n-t;j++) res[startx][j]=count++;
for(i=startx;i<n-t;i++) res[i][j]=count++;
for(;j>starty;j--) res[i][j]=count++;
for(;i>startx;i--) res[i][j]=count++;
startx+=1;
starty+=1;
t+=1;
}
if(n%2!=0) res[mid][mid]=count;
return res;
}
}