LeetCode(15) 3Sum
来源:互联网 发布:淘宝怎么添加客服号 编辑:程序博客网 时间:2024/06/04 19:37
解决这道题的算法:
第一步:对数组进行,以快速寻找满足条件的两个数。
第二步:首先对于a[0],j指向其后第一个,k指向最后一个;如果 a[j] + a[k] < -a[0], j++;如果a[j] + a[k] > -a[0], k–;这样只需o(n)的时间效率就可以扫描完整个数组,具体理论可以参考编程之美2.12快速寻找满足条件的两个数。
算法的运行时间是o(n^2);
代码如下:
class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(), nums.end()); int length = nums.size(); vector<vector<int>> result; vector<int> tmp; int i, j, k; for(i = 0; i < length - 2; ) { j = i + 1; k = length - 1; for(; j < k; ) { tmp.clear(); while(j < k) { if(nums[j] + nums[k] == -nums[i]) break; if(nums[j] + nums[k] > -nums[i]) k--; if(nums[j] + nums[k] < -nums[i]) j++; } if(j >= k) break; tmp.push_back(nums[i]); tmp.push_back(nums[j]); tmp.push_back(nums[k]); result.push_back(tmp); j++; while(j < k && nums[j] == nums[j - 1]) j++; k--; while(k > j && nums[k] == nums[k + 1]) k--; } i++; while(i < length && nums[i] == nums[i - 1]) i++; } return result; }};
其中第35~39行代码以及42~43行代码:
j++;while(j < k && nums[j] == nums[j - 1]) j++;k–;
while(k > j && nums[k] == nums[k + 1]) k–;i++;
while(i < length && nums[i] == nums[i - 1]) i++;
参考这里。
0 0
- Leetcode 15 3Sum
- LeetCode 15: 3Sum
- leetcode 15 3Sum
- [leetcode 15] 3Sum
- Leetcode【15】:3Sum
- [leetcode 15] 3Sum
- [Leetcode] 15 - 3Sum
- leetcode.15-----------3Sum
- leetcode 15 3Sum
- leetcode-15 3Sum
- 3Sum - LeetCode 15
- Leetcode #15 3 Sum
- LeetCode---(15) 3 sum
- LeetCode 15 - 3Sum
- leetcode-15 3sum
- leetcode 15 -- 3Sum
- Leetcode[15]-3Sum
- LeetCode 15: 3 Sum
- Android studio 如何引用aar
- 南北桥
- 服务器端验证
- 十七、最短路径问题(SPFA)
- 表单的验证 获得java script的初步认识
- LeetCode(15) 3Sum
- Freemarker操作字符串
- Android Studio 报错 Error:Execution failed for task ':app:dexDebug'。support-v7 Theme.AppCompat.Light
- leetcode 日经贴,Cpp code -Product of Array Except Self
- 漏洞补丁对比查看
- Java Web 高性能开发,第 1 部分: 前端的高性能
- SQL Server 触发器
- 说说PMO 的工作思路
- iPhone5s配置网易邮箱