美文网首页
《算法面试通关40讲》笔记

《算法面试通关40讲》笔记

作者: lvbubbles | 来源:发表于2020-09-12 23:09 被阅读0次
    leetcode 15 - 3sum
    要点
    1. 首先,和是确定的,可以降低一个自由度,从n^3降低到n^2
    2. 其次,排序的复杂度是n log(n),经过排序,只要遍历第一个维度,剩下的两个维度之和是确定的;
      1. 如果是普通的2sum问题,可以用一个哈希表来解决,遍历一个维度的复杂度是n,查找对应值的复杂度为1
      2. 但由于3sum中的不同2sum问题是不同的,所以才要排序;基于排序,可以将复杂度从嵌套遍历n^2,变成从两边向中间靠近的线性复杂度,最终结果的复杂度就是n^2 log(n),做法是:取左右两端之和,大了就使大值往小的方向取,小了就使小值往大的方向取。
      3. 另外,经过排序,如果在遍历中发现当前元素和前一个元素相同,那么可以跳过了,因为如果当前元素即便有解,结果也和之前得到的结果一样。
    代码
    class Solution {
    public:
        static vector<vector<int>> threeSum(vector<int>& nums) {
            vector<vector<int>> result;
            sort(nums.begin(), nums.end());
            for (unsigned i = 0, size = nums.size(); i < size; ++i) {
                if (i > 0 && nums[i-1] == nums[i]) continue;
                twoSumWithTarget(nums, i + 1, size - 1, -nums[i], result);
            }
            return result;
        }
        static void twoSumWithTarget(vector<int>& nums, unsigned l, unsigned r, int target, vector<vector<int>>& result) {
            while (l < r) {
                auto lVal = nums[l], rVal = nums[r];
                auto lrValSum = lVal + rVal;
                if (lrValSum == target) {
                    vector<int> subResult{lVal, rVal, -target};
                    result.emplace_back(subResult);
                    while (l < r && lVal == nums[l+1]) ++l;
                    while (l < r && rVal == nums[r-1]) --r;
                }
                if (lrValSum < target) ++l;
                else --r;
            }
        }
    };
    

    相关文章

      网友评论

          本文标题:《算法面试通关40讲》笔记

          本文链接:https://www.haomeiwen.com/subject/tvugektx.html