2024/5/29 天气真他妈好呀!好天气让我舒畅,可惜俺今天把我养护了两三个月的栀子花花苞又整掉了一朵,呜呜呜!看着它们一天天长大,花苞边由嫩绿泛白,结果被我不小心弄掉了,我是罪人。它们还想:我就是要这样香,你们他妈妈的管得着吗?于是我将它们转移到我看不到的地方了,以后每天去看看,隔几天浇浇水,施施肥。放两张相应的图片,然后做题吧
图一、实验室九点的蓝天
图二、哭泣的栀子花花苞
1、题目描述
2、逻辑分析
题目要求给定一个整数数组nums,返回三数之和为0的三数数组,其中三个数的要求是必须是不同位置的三个数。怎么做呢?我的想法就是暴力求解哈哈,三个循环,这样时间复杂度会太高,故舍弃该算法方案。想不出来啊,看看题解。题解通过双指针动态消去无效解来优化效率。
这个题解比官方的讲得好,而且还有步骤,我放过来:题解
3、代码演示
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
for(int k = 0; k < nums.length - 2; k++){
if(nums[k] > 0) break;
if(k > 0 && nums[k] == nums[k - 1]) continue;
int i = k + 1, j = nums.length - 1;
while(i < j){
int sum = nums[k] + nums[i] + nums[j];
if(sum < 0){
while(i < j && nums[i] == nums[++i]);
}else if(sum > 0){
while(i < j && nums[j] == nums[--j]);
}else{
res.add(Arrays.asList(nums[k], nums[i],nums[j]));
while(i < j && nums[i] == nums[++i]);
while(i < j && nums[j] == nums[--j]);
}
}
}
return res;
}
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2), 空间复杂度:
O
(
1
)
O(1)
O(1)。