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;
};