我的js算法爬坑之旅-搜索插入位置

119 阅读1分钟

第十天:力扣第35题,搜索插入位置

地址:leetcode-cn.com/problems/se…

思路:先用indexOf方法找位置,没有再找插入的位置。

var searchInsert = function(nums, target) {
    return nums.indexOf(target)==-1?a(nums):nums.indexOf(target);//三目运算符,下面的是扩展
    function a(nums){
         let filterResult = nums.filter(function(item){
             return (item < target);//这是数组filter的用法,返回重新创建一个符合的数组
         });
         return filterResult.length;
    }

    // a = nums.indexOf(target);
    // if(a==-1)
    // {
    //     let filterResult = nums.filter(function(item){
    //         return (item < target);
    //     });
    //     return filterResult.length;
    // }
    // else{
    //     return a;
    // }
};
执行用时:80 ms, 在所有 JavaScript 提交中击败了81.09%的用户
内存消耗:39.2 MB, 在所有 JavaScript 提交中击败了5.01%的用户

唔,看了别人的代码,我想的复杂了,这个本来就是有序数组,直接找大小就行了。
找是否有个大于或者等于target的元素就行了:

const searchInsert = (nums, target) => {
  for (let i = 0; i < nums.length; i++) {
    if (target <= nums[i]) {
      return i;
    }
  }
  return nums.length; 
}; 

还有一个是二分查找:

const searchInsert = (nums, target) => {
  let lo = 0;
  let hi = nums.length - 1;
  while (lo <= hi) {
    const mid = (lo + hi) >>> 1;//这个是无符号移位运算符
    if (nums[mid] == target) {
      return mid;
    } else if (nums[mid] > target) {
      hi = mid - 1;
    } else {
      lo = mid + 1;
    }
  }
  return lo; // 退出循环时 hi比lo小1
};