二分搜索、移除元素、有序数组的平方、长度最小的子数组

力扣704. 二分搜索

其思想是在有序数组中,每次通过比较中间元素,把查找区间缩小一半,从而快速定位目标值。

先从数组的长度设定left和right,之后再循环判断middle所在位置的数与target的大小,从而查找目标

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        while(left<=right){
            int middle=(left+right)/2;
            if(nums[middle]>target){
                right=middle-1;
            }
            else if(nums[middle]<target){
                left=middle+1;
            }
            else
            return middle;
        }
        return -1;
    }
}

1.要确定是左闭右闭还是左开右闭或者坐闭右开

2.如上代码是左闭右闭,while中left可以等于right,举个例子:left,right若都为1,1,1这是可以的。

3.若是左闭右开区间,则left不能等于right,且最开始初始化right时,不必减一,且在判断(numsmiddle>target时,right=middle,不再减一。

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length ;
        while (left < right) {
            int middle = left + (right - left) / 2;
            if (nums[middle] > target) {
                right = middle ;
            } else if (nums[middle] < target) {
                left = middle + 1;
            } else {
                return middle;
            }
        }
        return -1;
    }
}

力扣27.移除元素

由于数组是连续的,所以如果要移除中间的一个数,那么后面的就需要向前覆盖。最简单的是嵌套循环来写。

第一个循环用来遍历数组,如果是要删除的数,则再嵌套一个循环,将后面的数向前移。代码如下

java 复制代码
class Solution {
    public int removeElement(int[] nums, int val) {
        int l=nums.length;
        for(int i=0;i<l;i++){
            if(nums[i]==val){
                for(int j=i;j<l-1;j++){
                    nums[j]=nums[j+1];
                }
                l--;
                i--;
            }
        }
        return l;
    }
}

如果想要只使用一个for循环,则可以使用双指针的办法。初始化两个指针,全部指向数组下标为0的地方,fast向前走,如果不是val,则slow将fast的值写入数组;如果是val则不写入数组。当然代码如下

java 复制代码
class Solution {
    public int removeElement(int[] nums, int val) {
       int fast=0;
       int slow=0;
       for(int i=0;i<nums.length;i++){
        if(nums[fast]!=val){
            nums[slow++]=nums[fast++];
        }
        else{
            fast++;
        }
       }
       return slow;
    }
}

977.有序数组的平方

这题需要把数组中的数平方,并按照由小到大的顺序排放,数组一开始就是由小到大,但里面会有负数,所以我们可以直接暴力求解,全部平方再使用快排进行排序。复杂度是O(nlogn).

当然也有别的办法,也是双指针。在数组开头和末尾设置两个指针,平方的话这两个其中一个是最大的,我们再创建一个新数组,倒着把平方后的数放进去。代码如下

java 复制代码
class Solution {
    public int[] sortedSquares(int[] nums) {
        int k=nums.length-1;
        int[] result=new int[nums.length];
        for(int i=0,j=nums.length-1;i<=j;){
            if(nums[i]*nums[i]>nums[j]*nums[j]){
                result[k--]=nums[i]*nums[i];
                i++;
            }else
            {
                result[k--]=nums[j]*nums[j];
                j--;
            }
        }
        return result;
    }
}

209.长度最小的子数组

题目要求总和大于等于target的长度最小的**子数组,**可以使用暴力的方法,两个循环嵌套一个一个找。还可以使用滑动窗口的方法。

这里就只讲滑动窗口,这里借用卡尔的图(我也是看的他的),要有两个指针,i指向起,j指向终。先将j往后走,并将数组中的每个数加起来,等到大于等于target时,进入while循环,将此时的长度赋给subl,再用min找出最小的长度赋给result,这个长度就是j-i+1,但此时不一定是最小的,我们把numsi减掉,有可能还是>=target,i++,此时接着循环,找出最小长度,以此类推。直到sum<target,出while循环,j++,再循环下一轮。最后返回result,当然也会出现所有数都加完了,但依然小于target,此时我们返回0,这里我用 if(result==nums.length+1)来判断。

java 复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int i=0;
        int sum=0;
        int result=nums.length+1;
        int subl=0;
        for(int j=0;j<nums.length;j++){
            sum+=nums[j];
            while(sum>=target){
                subl=j-i+1;
                result=Math.min(result,subl);
                sum=sum-nums[i];
                i++;
            }
        }
        if(result==nums.length+1)
        return 0;
        return result;
    }
}
相关推荐
xcl09254 小时前
幼儿托育系统开发实战:从需求分析到上线全流程指南
java·大数据·需求分析
吴声子夜歌4 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
小小猪的春天4 小时前
Java 手写第一个 MCP Server:Spring AI MCP 半小时跑通
java·人工智能·spring boot·ai编程
find1star4 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing4 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21124 小时前
力扣160 21 86
算法·leetcode·职场和发展
今天AI了吗5 小时前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
许彰午5 小时前
27-AuthService登录链路
java·低代码·架构
泡海椒5 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP6 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理