[LeetCode] 18. 4Sum
来源:互联网 发布:mac os 10.12 百度云 编辑:程序博客网 时间:2024/05/17 03:41
思路:
做过3Sum的同学看到这道题的话肯定不会感到困难, 只是在3Sum的基础上再添加一层循环, 时间复杂度O(n^3), 但是根据https://discuss.leetcode.com/topic/28641/my-16ms-c-code的机智思路, 可以在每层循环开始前做几次非常机智的判断, 如果前几个数的和就大于目标值了, 后面肯定更大了, 直接跳出循环. 如果当前值加上尾部的几个值小于目标值, 那么也不用进内层循环了, 也直接做下一次循环就好, 这样节省了大量时间, 真是学习到了! 以后要多注意剪枝
vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> res; int size = nums.size(); if (size < 4) return res; sort(nums.begin(), nums.end()); for (int i = 0; i < size - 3; i++) { if (i && nums[i] == nums[i - 1]) continue; // 精髓之处 if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) break; if (nums[i] + nums[size - 1] + nums[size - 2] + nums[size - 3] < target) continue; // vector<int> candidate; for (int j = i + 1; j < size - 2; j++) { if (j > i + 1 && nums[j] == nums[j - 1]) continue; // 同样精髓之处 if (nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) break; if (nums[i] + nums[j] + nums[size - 1] + nums[size - 2] < target) continue; // int TwoSumTarget = target - nums[i] - nums[j]; int head = j + 1, tail = size - 1; while (head < tail) { if (nums[head] + nums[tail] == TwoSumTarget) { candidate.push_back(nums[i]); candidate.push_back(nums[j]); candidate.push_back(nums[head]); candidate.push_back(nums[tail]); res.push_back(candidate); candidate.clear(); while (head < tail && nums[head + 1] == nums[head]) head++; while (head < tail && nums[tail - 1] == nums[tail]) tail--; head++, tail--; } else if (nums[head] + nums[tail] < TwoSumTarget) head++; else tail--; } } } return res;}
0 0
- LeetCode --- 18. 4Sum
- [Leetcode] 18. 4Sum
- leetcode 18. 4Sum
- 18. 4Sum LeetCode
- leetcode 18. 4Sum
- 【LeetCode】18. 4Sum
- LeetCode - 18. 4Sum
- leetcode 18. 4Sum
- Leetcode 18. 4Sum
- LeetCode 18. 4Sum
- 【leetcode】18. 4Sum
- leetcode 18. 4Sum
- [leetcode]18. 4Sum
- leetcode 18. 4Sum
- leetcode 18. 4Sum
- leetcode 18. 4Sum
- [LeetCode] 18. 4Sum
- LeetCode 18. 4Sum
- 嵌入式linux从主机linux提供的nfs服务挂载根文件系统
- DOM4J XML解析
- hdu 4165 Pills
- 阿里云服务器 linux ngix php mysql 建站踩过的坑
- 3D拖拽相册
- [LeetCode] 18. 4Sum
- 数据库中的user和schema的关系
- javascript面向对象学习笔记(三)——继承
- c语言中字符数组和字符指针的区别:(一句话,一旦要修改就用字符数组)
- Swift的循环引用以weak
- 威佐夫博弈(2堆)应用-- HDU 1527 取石子游戏
- 走遍中国 —— 中国三大半岛
- hdu 2512 一卡通大冒险
- 深度学习试验之 多层感知器