算法学习 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 ;
    }
}

你可能感兴趣的:(算法,算法,学习,leetcode)