力扣hot100双指针

283移动零

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    // 快慢指针
    // zLeft指向的位置是0串的最左边,i指向的位置是0串的最右边+1,交换时交换最左边的0和0串后面第一个不为0的数字
    // i是快指针,遍历整个数组寻找哪些位置需要调换,zLeft是0串的最左边
    let zLeft = 0;
    for (let i = 0; i < nums.length; i ++) {
        if (nums[i] !== 0) { // 如果这个数字不是0,那么需要进行交换
            [nums[i], nums[zLeft]] = [nums[zLeft], nums[i]]; // 解构赋值
            zLeft ++;
        }
    }
};

11盛最多水的容器

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    // 初始指针放在两头,0,n-1,不断向中间移动直到指针相遇
    // 移动过程中丢掉更矮的那一头,谁更矮就丢掉谁
    let left = 0;
    let right = height.length - 1;
    let maxV = 0;
    while (left <= right) {
        let tmpV = Math.min(height[left], height[right]) * (right - left);
        maxV = Math.max(tmpV, maxV);
        if (height[left] < height[right]) {
            left ++;
        } else {
            right --;
        }
    }
    return maxV;
};

15三数之和

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    // 顺序遍历nums[i],在[i:n-1]的区间内用双指针的办法判断是否有满足nums[j]+nums[k]=-nums[i]
    // 先排序
    const n = nums.length;
    const ansNums = [];
    if (n < 3) return ansNums; //如果数组不够三个数,那么返回空数组
    nums.sort((a, b) => a - b); // 排序时注意转换为数值排序
    if (nums[0] > 0 || nums[n - 1] < 0) return ansNums; //不可能加和为0
    for (let i = 0; i < n - 2; i ++) {
        if (i > 0 && nums[i] == nums[i - 1]) continue; //保证三元组不能重复;注意写法,规避越界问题
        let j = i + 1;
        let k = n - 1;
        while(j < k) {
            if (nums[i] + nums[j] + nums[k] < 0) {
                j ++;
            } else  if (nums[i] + nums[j] + nums[k] > 0){
                k --;
            } else {
                ansNums.push([nums[i], nums[j], nums[k]]);
                while (j < k && nums[j + 1] == nums[j]) j ++; //保证三元组不能重复;保证不能越界
                while (j < k && nums[k - 1] == nums[k]) k --; //保证三元组不能重复;保证不能越界
                j ++;
                k --;
            }
        }
    }
    return ansNums;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值