力扣算法的方法(1.二分法,2.双指针思路,3.滑动窗口)


一、算法刷题开始跟老师了!!来源于代码随想录!!!

1.二分法

1.1 给定的数组区间为左闭右闭

int num[]  int target  判断target的值是否在num中,在返回索引,不在返回-1

当时左闭右闭的时候,我们的区间判断就为:

left=0;
right=num.size-1;
middle=(left+right)/2
while(left<=right){//这里是因为比如给定的数组为int[2,2],right=2,left=2,是可以相等的
if(nums[middle]>target){//证明在middle的左边,又因为nums是左闭右闭合,可以等于middle,middle
//判断过了,所以-1
right=middle-1;
}else if(nums[middle]<target){//证明在middle的右边边,又因为是左闭右闭合,可以等于middle
//又因为middle判断过了,所以+1
left+=1}else{
return middle;
}
}

1.2 给定的数组区间为左闭右开

int num[]  int target  判断target的值是否在num中,在返回索引,不在返回-1

当时左闭右闭的时候,我们的区间判断就为:

left=0;
right=num.size;//因为right不包含右边界,所以他不用-1
middle=(left+right)/2
while(left<right){//这里是因为比如给定的数组为int[2,2),left=2,right<2的,所以不能相等。
if(nums[middle]>target){//证明在middle的左边,又因为nums是左闭右开,之前不包含middle,
 //middle没判断,所以right=middle;
right=middle;
}else if(nums[middle]<target){//证明在middle的右边边,又因为是左闭右闭合,可以等于middle
//又因为middle判断过了,所以+1
left+=1}else{
return middle;
}
}

2. 27题移除元素(双指针思路)

返回删除后的数组长度:

  int test(int num[],int a) {
        int slow=0;//定义一个慢指针,用来记录fast传入的值
        for(int fast=0;fast<num.length;++fast){//定义快指针用来去寻找目标a
            if(num[fast]!=a){
                num[slow]=num[fast];//也可以直接num[slow++]=num[fast]
                slow++;
            }
        }
        return slow;//因为如果不等于a,进行删除操作的话,slow是不+的,所以数组的长度就为slow
    }

3. 977. 有序数组的平方(双指针)

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

class Solution {
    public int[] sortedSquares(int[] nums) {
       int[] result = new int[nums.length];//定义一个新的数组,用来存储平方后的数组
        int k=nums.length-1;//得到一个数组最大的索引
        for(int i=0,j=k;i<=j;){//双指针,i,j。对于i和j的+,-是需要进行判断的,所以写在下面
            if(nums[i]*nums[i]>nums[j]*nums[j]){//用来判断,第一个和最后一个哪个的平方大(因为又负数)
                result[k]=nums[i]*nums[i];//将大的赋值给result[]最后一位,这样就可以得到一个从小到大的数组了
                k--;
                i++;
            }else{
                result[k]=nums[j]*nums[j];
                k--;
                j--;
            }
        }
        return result;
    }
}

4 长度最小的子数组(滑动窗口)

class Solution {

    // 滑动窗口
    public int minSubArrayLen(int s, int[] nums) {
        int left = 0;
        int sum = 0;
        int result = Integer.MAX_VALUE;
        for (int right = 0; right < nums.length; right++) {
            sum += nums[right];
            while (sum >= s) {
                result = Math.min(result, right - left + 1);
                sum -= nums[left++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值