算法学习 day1

代码随想录 day1 [704. 二分查找|27. 移除元素]

704. 二分查找
Tips
  1. 中间值的计算 start + (end - start)/2,为了避免数据长度为int最大值是(start+end)溢出
  2. 循环条件要注意start=end的情况

思考:

  • 中间索引计算:很容易想到 (end+start)/2 ,当数组长度为Integer.MAX_VALUE时,会溢出,故使用start + (end - start) / 2 代替
  • 两指针相遇时,也需要判断和目标值是否相同,即start=end
class Solution {
    public int search(int[] nums, int target) {
        int l = 0 ,r = nums.length -1 ;
        while(l <= r){
            int m = l +(r-l)/2;
            if(nums[m] == target){
                return m ;
            }else if(nums[m] < target){
                l = m + 1;
            }else{
                r = m -1 ;
            }
        }
        return -1 ;
    }
}
27. 移除元素
Tips
  1. 主要是理解题意,之后就是移动元素到数组末端和交换数组元素
  2. 返回个数为数据中非目标元素的个数,若便利到非目标元素就要计数+1了

思考:

  • 根据题意可知,找到移除目标元素后的元素个数即可,非目标元素后面的元素不用考虑,可以联想到将目标元素统一移动到数据组末端
  • len用来记录非目标元素的个数
class Solution {
    public int removeElement(int[] nums, int val) {
        int l = 0 , r = nums.length -1 ,len = 0 ;
        while(l <= r){
            if(nums[r] == val){
                r-- ;
            }else if(nums[l] == val){
                //l 和 r交换位置
                int tmp = nums[l];
                nums[l] = nums[r];
                nums[r] = tmp;
                l++ ; r-- ; len++ ;
            }else{
                l++;
                //当nums[l]!=目标值时,数组新长度要加1,当前值属于新数组
                len++;
            }
        }
        return len ;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值