update 0018.四数之和 完善注释

This commit is contained in:
Yuhao Ju
2022-11-24 22:12:59 +08:00
committed by GitHub
parent dddbb95ea7
commit c1f1c1c42f

View File

@ -136,25 +136,26 @@ class Solution {
Arrays.sort(nums); Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) { for (int i = 0; i < nums.length; i++) {
// nums[i] > target 直接返回, 剪枝操作 // nums[i] > target 直接返回, 剪枝操作
if (nums[i] > 0 && nums[i] > target) { if (nums[i] > 0 && nums[i] > target) {
return result; return result;
} }
if (i > 0 && nums[i - 1] == nums[i]) { if (i > 0 && nums[i - 1] == nums[i]) { // 对nums[i]去重
continue; continue;
} }
for (int j = i + 1; j < nums.length; j++) { for (int j = i + 1; j < nums.length; j++) {
if (j > i + 1 && nums[j - 1] == nums[j]) { if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重
continue; continue;
} }
int left = j + 1; int left = j + 1;
int right = nums.length - 1; int right = nums.length - 1;
while (right > left) { while (right > left) {
// nums[k] + nums[i] + nums[left] + nums[right] > target int会溢出
long sum = (long) nums[i] + nums[j] + nums[left] + nums[right]; long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
if (sum > target) { if (sum > target) {
right--; right--;
@ -162,7 +163,7 @@ class Solution {
left++; left++;
} else { } else {
result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right])); result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
// 对nums[left]和nums[right]去重
while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++; while (right > left && nums[left] == nums[left + 1]) left++;
@ -186,10 +187,10 @@ class Solution:
nums.sort() nums.sort()
n = len(nums) n = len(nums)
res = [] res = []
for i in range(n): for i in range(n):
if i > 0 and nums[i] == nums[i - 1]: continue if i > 0 and nums[i] == nums[i - 1]: continue # 对nums[i]去重
for k in range(i+1, n): for k in range(i+1, n):
if k > i + 1 and nums[k] == nums[k-1]: continue if k > i + 1 and nums[k] == nums[k-1]: continue # 对nums[k]去重
p = k + 1 p = k + 1
q = n - 1 q = n - 1
@ -198,6 +199,7 @@ class Solution:
elif nums[i] + nums[k] + nums[p] + nums[q] < target: p += 1 elif nums[i] + nums[k] + nums[p] + nums[q] < target: p += 1
else: else:
res.append([nums[i], nums[k], nums[p], nums[q]]) res.append([nums[i], nums[k], nums[p], nums[q]])
# 对nums[p]和nums[q]去重
while p < q and nums[p] == nums[p + 1]: p += 1 while p < q and nums[p] == nums[p + 1]: p += 1
while p < q and nums[q] == nums[q - 1]: q -= 1 while p < q and nums[q] == nums[q - 1]: q -= 1
p += 1 p += 1
@ -258,12 +260,12 @@ func fourSum(nums []int, target int) [][]int {
// if n1 > target { // 不能这样写,因为可能是负数 // if n1 > target { // 不能这样写,因为可能是负数
// break // break
// } // }
if i > 0 && n1 == nums[i-1] { if i > 0 && n1 == nums[i-1] { // 对nums[i]去重
continue continue
} }
for j := i + 1; j < len(nums)-2; j++ { for j := i + 1; j < len(nums)-2; j++ {
n2 := nums[j] n2 := nums[j]
if j > i+1 && n2 == nums[j-1] { if j > i+1 && n2 == nums[j-1] { // 对nums[j]去重
continue continue
} }
l := j + 1 l := j + 1
@ -320,6 +322,8 @@ var fourSum = function(nums, target) {
if(sum < target) { l++; continue} if(sum < target) { l++; continue}
if(sum > target) { r--; continue} if(sum > target) { r--; continue}
res.push([nums[i], nums[j], nums[l], nums[r]]); res.push([nums[i], nums[j], nums[l], nums[r]]);
// 对nums[left]和nums[right]去重
while(l < r && nums[l] === nums[++l]); while(l < r && nums[l] === nums[++l]);
while(l < r && nums[r] === nums[--r]); while(l < r && nums[r] === nums[--r]);
} }