中级农民
- 积分
- 202
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-8-2
- 最后登录
- 1970-1-1
|
- class Solution {
- // 不用排序的版本,超时
- public List<List<Integer>> threeSum(int[] nums) {
- List<List<Integer>> results = new ArrayList<>();
- Set<List<Integer>> set = new HashSet<>();
- Map<Integer, Integer> map = new HashMap<>();
- for (int num : nums) {
- map.put(num, map.getOrDefault(num, 0) + 1);
- }
- for (int i = 0; i < nums.length; i++) {
- // 注意 j 从 0 开始,因为内部还是需要判断升降序来去重,如果从 i + 1 开始可能会漏解
- for (int j = 0; j < nums.length; j++) {
- int a = nums[i];
- int b = nums[j];
- int c = 0 - a - b;
- // 去重
- if (!(a >= b && b >= c)) {
- continue;
- }
- if (map.containsKey(c)) {
- map.put(a, map.get(a) - 1);
- map.put(b, map.get(b) - 1);
- map.put(c, map.get(c) - 1);
- } else {
- continue;
- }
- if (map.get(a) >= 0 && map.get(b) >= 0 && map.get(c) >= 0) {
- // 去重
- set.add(Arrays.asList(a, b, c));
- }
- map.put(a, map.get(a) + 1);
- map.put(b, map.get(b) + 1);
- map.put(c, map.get(c) + 1);
- }
- }
- results.addAll(set);
- return results;
- }
- }
复制代码
- class Solution {
- // 不用排序的版本,超时
- public List<List<Integer>> threeSum(int[] nums) {
- List<List<Integer>> results = new ArrayList<>();
- Set<List<Integer>> set = new HashSet<>();
- for (int i = 0; i < nums.length; i++) {
- for (int j = 0; j < nums.length; j++) {
- int a = nums[i];
- int b = nums[j];
- int c = 0 - a - b;
- if (!(a >= b && b >= c)) {
- continue;
- }
- for (int k = 0; k < nums.length; k++) {
- if (nums[k] == c && i != j && j != k && i != k) {
- set.add(Arrays.asList(a, b, c));
- }
- }
- }
- }
- results.addAll(set);
- return results;
- }
- }
复制代码
不排序两个版本均TLE, 前者过了倒数第二个case,最后一个3000个0的case 看脸跑,1200ms-1300ms之间,后者最后两个Case都TLE |
|