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

704.二分查找

题目链接:704.二分查找

//左闭右闭,即左右指针所指元素在查找区间中
class Solution {
    public int search(int[] nums, int target) {
        //防止进行无效循环
        if(target < nums[0] || target > nums[nums.length - 1])
            return -1;
        int left = 0;//左指针
        int right = nums.length - 1;//右指针
        while(left <= right){//当区间有效时,进入循环
            int mid = (left + right) / 2;
            //整形计算除法截断小数部分,mid = [(left + right) / 2],即向下取整
            if(nums[mid] < target)//目标小于中间值,右移左指针
                left = mid + 1;
            else if(nums[mid] > target)//目标大于中间值,左移右指针
                right = mid - 1;
            else//nums[mid] == target
                return mid;
        }
        return -1;//循环结束,未查找到,返回-1
    }
}

若目标数不在数组中,循环中左右指针会相等,最后一次循环对左右指针进行操作后会出现right < left,退出循环

  • 左闭右开
int right = nums.length;
while(left < right){//右指针所指不在查找区间中
            int mid = (left + right) / 2;
            if(nums[mid] < target)
                left = mid + 1;
            else if(nums[mid] > target)
                right = mid;
            else
                return mid;
        }

当左右指针相等时退出循环,当数组仅有单元素时:

left = 0;
right = 1;
mid = 0;
nums[mid] == nums[left]

循环中成功检查nums[left]是否时target

  • 优化
  • int mid = left + (right - left) >> 1;//避免整数溢出,>> 1 相当于 /2

27.移除元素

题目链接:27.移除元素

class Solution {
    public int removeElement(int[] nums, int val) {
        int k = 0;//慢指针
        for(int i = 0; i < nums.length; i++){//快指针
            if(nums[i] != val){//快指针遍历数组
                nums[k] = nums[i];_
                k++;//覆盖数组元素后,慢指针自增一
            }    
        }
        return k;
    }
}

977.有序数组的平方

题目链接:977.有序数组的平方

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] result = new int[nums.length];//结果数组
        int left = 0;//左指针
        int right = nums.length - 1;//右指针
        int position = nums.length - 1;//结果指针
        
        while(left <= right){
            //一次只移动一个指针,当左右指针相等时,遍历全部数组
            int leftSquare = nums[left] * nums[left];
            int rightSquare = nums[right] * nums[right];
             //将平方较大的结果记录到结果数组末尾
            if(leftSquare > rightSquare){
                result[position] = leftSquare;
                left++;//将指向被记录元素的指针向数组中间移动
            }else{
                result[position] = rightSquare;
                right--;
            }
            position--;//将结果指针移向结果数组开头
        } 
        return result;
    }
}
  • 结果数组只能由后往前填充

  • 如果初始化position = 0,即每次将较小数填入position所指位置,会导致输出不是非递减模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值