代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

704:二分查找

var search = function(nums, target) {
  //法一(暴力法):
  for(let i=0;i<nums.length;i++){
         if(nums[i]===target)
         return i;
     }
     return -1; 
    

    //  法二indexOF:
    return nums.indexOf(target);

    //法三:ES6 findeIndex方法
    自己使用出错
     return nums.findIndex((item)=>{
        return item===target
           })
    */

    var l = 0;
    var r = nums.length - 1;//使用[]方法
    while (l <= r) { // 当left=right时,由于nums[right]在查找范围内,所以要包括此情况,比如只有一个元素的情况
      let m = ~~(l + (r - l) / 2);
     if (nums[m] == target) {
        return m;
    } else if (nums[m] > target) { // 如果中间数大于目标值,要把中间数排除查找范围,所以右边界更新为mid-1;如果右边界更新为mid,那中间数还在下次查找范围内
        r = m-1;
    } else {
        l = m+1;
    }
}
    return -1;
};
// [2]=3 [4]=9

第一想法

暴力+indexOf方法

困难

let m = ~~(l + (r - l) / 2);
之前java写过这道题,但当时定义的是int
dedug时看到m=4.25?

收获

  • 位运算 + 防止大数溢出
    mid = left + ((right - left) >> 1);
    有()向下溢出

将x 左移一位实现× 2 ,将x 右移一位实现÷ 2
a<<1≡a∗2
a>>1 ≡ a / 2

  • findeIndex

还没学到方法

  • js中取整问题

27.移除元素

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function (nums, val) {
 
    //法一:乱来
      var count = nums.length;
      for (var i = 0; i < nums.length; i++) {
          if (nums[i] === val) {
              nums[i] = -1;
              count--;
          }
      }
      nums = nums.sort();
      nums = nums.reverse();
      return count;

      //法二:快慢指针
     var slow=0;
     for(var fast=0;fast<nums.length; fast++){
         if(nums[fast]!==val){
             nums[slow++]=nums[fast];
         }
     }
     return slow;
     

     //法三,前后指针,因为顺序可以打乱
     var l=0;
     var r = nums.length-1;
     while(l<=r){
         if(nums[l]===val){
            nums[l]=nums[r--];
         }else
         l++;
     }
     return l;
  };

第一想法

法三,但很快就暴力写法

收获

  • 快慢指针思想:快指针指向满足条件的元素,找到传给慢指针

你可能感兴趣的:(代码随想录,算法)