【JS刷题】双指针类

16.最接近的三数之和

力扣16
思路:双指针

存三数之和与target的差的绝对值的最小值min|sum - target|以及这个和sum

  1. 先排序nums.sort((a, b)=>a - b)
  2. 固定第一个数i并遍历这个数(0:lenth-2)
  3. 双指针分别指向i+1lenth-1,根据和sumtarget的相对大小移动指针,相等时直接返回

绝对值Math.abs()
无穷大值Infinity
数组求和的计算方法arr.reduce((prev,current,index,arr)=>{},initValue)

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function(nums, target) {
    var n = nums.length
    if(n===3) return getSum(nums)
    nums.sort((a,b)=>a-b)
    var minNum = Infinity
    var res
    for(let i=0;i<n-2;i++){
        let left = i+1
        let right = n - 1
        while(left<right){
            let sum = nums[i]+nums[left]+nums[right] 
            let diff = Math.abs(sum - target)
            if(diff < minNum){
                minNum = diff
                res = sum
            }
            if(sum === target){
                return target
            } else if(sum <target){
                left += 1
            } else{
                right -= 1
            }
        }
    
    }
    return res
};


function getSum(arr){
    return arr.reduce((total,current)=>total+current,0)
}

524. 通过删除字母匹配到字典里最长单词

力扣524
思路:指针
讲字符串数组先排序(长度降序,字典序升序)
然后挨个匹配,匹配到的第一个就是所求,如果没有匹配到,则返回空串。

Array中的fill方法 Array(n).fill(‘a’)
Array(n):定义一个数组,里面有n个元素。
fill()方法将一个数组的所有元素从开始索引填充到具有静态值的结束索引arr.fill(value, start, end)

字符串里面超出index取到的值是undefined
两个字符串可以比较大小,但是不能相减
dictionary.sort((a,b)=>b.length-a.length||(a>b?1:-1))
arr.sort()中函数中 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前

/**
 * @param {string} s
 * @param {string[]} dictionary
 * @return {string}
 */
var findLongestWord = function(s, dictionary) {
    var res = ''
    dictionary.sort((a,b)=>b.length-a.length||(a>b?1:-1))
    for (let i = 0;i<dictionary.length;i++){
        let flag = match(dictionary[i],s)
        if(flag>0){
            return dictionary[i]
        }
    }
    return res
};

function match(dict, s){
    let j = 0
    for(let i=0;i<s.length;i++){
        if(s[i]==dict[j]){
            j++
        }
        if(j == dict.length){
            return true
        }
    }
    return false
}

75.搜索二维矩阵

力扣7
思路:

  1. 先找出第一列的数里面target的下界值,从而锁定目标值可能的所在行
  2. 在该行继续寻找

注意在有序的数字列表中搜索一个值,采用二分查找降低复杂度

Math.floor() 向下整除

力扣240
思路:
从右上角num开始遍历

  1. 小于该值向左移动,成为新的右上角
  2. 大于该值向下移动,成为新的右上角

重点在于:对于右上角的值,下面的值都大于它,左边的值都小于它
复杂度(m+n)

var searchMatrix = function(matrix, target) {
    var m = matrix.length
    var n = matrix[0].length
    var ms = 0
    var ns = n - 1
    while(ms < m & ns >= 0){
        if(matrix[ms][ns] === target){
            return true
        }else if(matrix[ms][ns] > target){
            ns -= 1
        }else{
            ms += 1
        }
    }
    return false   
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值