力扣:704. 二分查找、27. 移除元素

发布时间:2024年01月11日

704:给定一个?n?个元素有序的(升序)整型数组?nums?和一个目标值?target??,写一个函数搜索?nums?中的?target,如果目标值存在返回下标,否则返回?-1

看题目最容易想到的就是一个循环,一个一个的匹配,找到了直接返回下标,直到找到最后一个,没有找到返回-1;

具体代码实现如下:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
  let _index = 0;
  while(_index < nums.length){
    if(nums[_index] === target){
      return _index
    }
    _index++
  }
  return -1
};

这道题有一个关键点是有序的数组,因为有序会想到另外一种思路,二分法;

具体代码实现如下:

var search = function(nums, target) {
  let left = 0;
  let right = nums.length-1;
  while(left <= right){
      const middle = left + parseInt((right-left)>>1);
      if(nums[middle]>target){
          right = middle-1;
      } else if(nums[middle]<target){
          left = middle+1
      } else {
          return middle
      }
  }
  return -1;
};

27:给你一个数组?nums?和一个值?val,你需要?原地?移除所有数值等于?val?的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用?O(1)?额外空间并?原地?修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

题目要求是不能创建额外的空间,就只能操作原数组,在原数组中删除某个元素js中最擅长的就是splice方法了

具体代码实现如下:

var removeElement = function(nums, val) {
  for(let i = 0; i<nums.length;){
      if(nums[i]===val){
          nums.splice(i,1);
      } else {
          i++;
      }
  }
  return nums.length
};

使用了内置函数splice,感觉胜之不武;还有没有其他的方法呢?

尝试使用快慢指针,快指针遍历每一个元素,慢指针在遇到要删除的元素不向后移动即(不自增),最后返回慢指针就可以了;

具体代码实现如下:

var removeElement = function(nums, val) {
  let slow = 0;
  let fast = 0;
  for(fast ; fast <nums.length;fast++){
      if(nums[fast]!==val){
          nums[slow]= nums[fast]
          slow++
      }
  }
  return slow
};

今天的分享就到这里,事已至此还是先吃饭吧!

文章来源:https://blog.csdn.net/qq_39562292/article/details/135513099
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。