题目解析
先排序,然后采用双指针。
pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut nums = nums.clone();
let mut ans = vec![];
let len = nums.len();
nums.sort();
for i in 0..len {
//如果 nums[i] == nums[i-1] 跳过,因为在第之前已经有了检测,避免重复检测
if i > 0 && nums[i] == nums[i-1] {
continue;
}
let mut j = len - 1;
let t = - nums[i];
for k in (i+1)..len{
if k > i + 1 && nums[k] == nums[k-1] {
continue;
}
while k < j && j < len && nums[k] + nums[j] > t {
j -= 1;
}
if k == j {
break;
}
if nums[k] + nums[j] == t{
ans.push(vec![nums[i], nums[k], nums[j]]);
}
}
}
return ans;
}
复杂度分析
时间复杂度:O(n^2)。
空间复杂度:O(1)。
网友评论