/** * @param {character[]} s * @return {void} Do not return anything, modify s in-place instead. */ var reverseString = function(s) { // 双指针交换字符 let a = -1,b = s.length while(++ a < --b){ [s[a], s[b]] = [s[b], s[a]] } return s };
/** * @param {number[]} nums * @return {number[][]} */ /** nums.sort() for first = 0 .. n-1 if first == 0 or nums[first] != nums[first-1] then // 第三重循环对应的指针 third = n-1 for second = first+1 .. n-1 if second == first+1 or nums[second] != nums[second-1] then // 向左移动指针,直到 a+b+c 不大于 0 while nums[first]+nums[second]+nums[third] > 0 third = third-1 // 判断是否有 a+b+c==0 check(first, second, third) 作者:LeetCode-Solution 链接:https://leetcode.cn/problems/3sum/solution/san-shu-zhi-he-by-leetcode-solution/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 */
/** 怎么确定去重 ?a , b , c 三个数 首先这里已经升序排序了。 a 去重 : a 是第一次遍历,本题中是sortArr[i],去重的时候选择sortArr[i] != sortArr[i - 1]而非sortArr[i] != sortArr[i + 1]) 因为a是第一个数,应当允许其后面有值与其相等,例如{-1,-1,2}的情况。 sortArr[i] != sortArr[i + 1])会直接把{-1,-1,2}去掉。 b、c去重:同a */ var threeSum = function(nums) { let resultArr = [] //注意 升序排序方法nums.sort(((a,b) => a-b)),不能直接nums.sort let sortArr = nums.sort(((a,b) => a-b)) let length = nums.length for (let i = 0; i < length - 1; i++) { // i是基准 // 两个相邻的数不相等的时候,才开始循环 if(i == 0 || sortArr[i] != sortArr[i - 1]) { let k = length - 1 // j和k形成双指针,j ++ ,k -- for (let j = i + 1; j < sortArr.length - 1; j++) { // 这里是找到第二个数 if(j == i + 1 || sortArr[j] != sortArr[j - 1]) { // 从后往前找第三个数 // 因为已经排序过来 所以当前两个数固定从后往前找第三个时,三数之和必定是从大到小 while(sortArr[i] + sortArr[j] + sortArr[k] > 0 && k > j + 1){ k -- } //找到咯 if(sortArr[i] + sortArr[j] + sortArr[k] === 0 && k > j){ resultArr.push([sortArr[i],sortArr[j],sortArr[k]]) } } } } } return resultArr };