代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素 977.有序数组的平方

704. 二分查找、27. 移除元素 977.有序数组的平方

704.二分查找

左闭右闭

int l=0,r=nums.length-1; while(l<=r) l=m+1; r=m-1;

class Solution {
    public int search(int[] nums, int target) {//左闭右闭
        int l=0,r=nums.length-1;
        while(l<=r){
            int m=(l+r)>>>1;
            if(nums[m]<target){//是nums[m]与target比较 不是m与target
                l=m+1;
            }else if(nums[m]>target){
                r=m-1;
            }else{
                return m;
            }
        }
        return -1;
    }
}

左闭右开

int l=0,r=nums.length; while(l<r) l=m+1; r=m;

class Solution {
    public int search(int[] nums, int target) {//左闭右开
        int l=0,r=nums.length;
        while(l<r){
            int m=(l+r)>>>1;
            if(nums[m]<target){//是nums[m]与target比较 不是m与target
                l=m+1;
            }else if(nums[m]>target){
                r=m;
            }else{
                return m;
            }
        }
        return -1;
    }
}

if(nums[m]<target){//是nums[m]与target比较 不是m与target

27.移除元素

双指针法

class Solution {
    public int removeElement(int[] nums, int val) {
        int n=nums.length;
        for(int i=0;i<n;i++){
            if(nums[i]==val){
                for(int j=i+1;j<n;j++){
                    nums[j-1]=nums[j];//不是nums[i]=nums[j];这里面i是不变的  想持续更新 需要两个变量
                }
                i--;//指的依旧是现在这个数 只不过原来的数被删了重新验证一下新的数
                n--;//数组长度-1  确定循环次数  同时也是新数组长度
            }
        }
        return n;//return 的不是i是n  i在循环结束已经被删掉了 n代表新数组长度
    }
}

nums[j-1]=nums[j];//不是nums[i]=nums[j];这里面i是不变的 想持续更新 需要两个变量

数组长度更新以及反复检验用 i--和n-- 很巧妙 我没想到

return n;//return 的不是i是n i在循环结束已经被删掉了 n代表新数组长度

977.有序数组的平方

暴力排序

class Solution {
    public int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = nums[i] * nums[i];
        }
        Arrays.sort(nums);
        return nums;
    }
}

如动画所示:
image

双指针

class Solution {
    public int[] sortedSquares(int[] nums) {
        int n=nums.length;
        int l=0,r=n-1;
        int[] ans=new int[n];
        int j=n-1;
        while(l<=r){//写成l<=n了  粗心大意这一块
            if(nums[l]*nums[l]>nums[r]*nums[r]){// if(nums[l] * nums[l] > nums[r] * nums[r])
                ans[j]=nums[l]*nums[l];// res[j--] = nums[l] * nums[l++];
                j--;
                l++;
            }else{
                ans[j]=nums[r]*nums[r];
                j--;
                r--;
            }
        }
        return ans;
    }
}
posted @ 2025-10-10 12:00  JuanWenhao  阅读(11)  评论(0)    收藏  举报