leetcode之双指针

76 阅读1分钟

theme: github

16. 最接近的三数之和


/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function(nums, target) {
    //定义
let L,R,res=Infinity,ans
    //排序
    nums.sort((a,b)=>a-b)
    //比较复制
    for(let i=0;i<nums.length;i++){
        L=i+1
        R=nums.length-1
        while(L<R){
            let sum=nums[i]+nums[L]+nums[R]
            if(sum<target) L++
            else R--
            if(Math.abs(sum-target)<res){
                ans=sum
                res= Math.abs(sum-target)
            }
           
        }
    }
    //返回
    return ans
};

75. 颜色分类

冒泡排序


/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var sortColors = function(nums) {
    for(let i=0;i<nums.length;i++){
        for(let j=0;j<nums.length-i-1;j++){
            if(nums[j]>nums[j+1]){
                let temp=nums[j]
                nums[j]=nums[j+1]
                nums[j+1]=temp
            }
        }
    }
    return nums
};

344. 反转字符串

简单题,重拳出击,一头一尾,遍历,交换指针所指的值

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var reverseString = function(s) {
    const len=s.length
    let l=0,r=len-1
    while(l<r){
        let temp=s[l]
        s[l]=s[r]
        s[r]=temp
        l++
        r--
    }
     return s
};

925. 长按键入

return i===n:

1.比较后无论name和typed谁有剩余,都为false

2.都没有剩余且在前面的比较中没有返回false则返回true

/**
 * @param {string} name
 * @param {string} typed
 * @return {boolean}
 */
var isLongPressedName = function(name, typed) {
     
    const m=name.length,n=typed.length
    let i=0,j=0
    while(j<n){
        if(name[i]===typed[j]){
            i++
            j++
        }else if(typed[j]===typed[j-1]){
            j++
        }else return false
    }
    return i===m
}

总结:

1.目的:减少时间复杂度,在遍历时尽量通过条件限制来减少时间复

2.方法:设置三个指针,一个指针大循环,按照次序递增,剩下的两个指针分别指在两端