leetcode入门题目第二弹
创建时间:
字数:467
阅读:
leetcode 回顾 从2020-12-7起
18四数之和
给定一个数组求n个数组成不重复的排列且这几个数的和为定值
思路
首先将数组 numsnums 升序排序,并把答案四元组中没确定的个数设为 nn
我把剪枝分为了 4 类,括号内的是用什么完成剪枝
- 如果剩余可选的数字数量少于 n,则剪掉(递归返回);
- 每层递归的 for 循环中,从第二轮循环开始,如果数组中当前数字和前一个相同,则剪掉(进行下一次循环,这条的任务就是去重);
- 如果 当前数字 + 已确定数字的和 + (n - 1) * 排序后数组中当前数字的下一个数字 > target,则说明后面的数无论怎么选,加起来都一定大于 target,所以剪掉(递归返回);
- 如果 当前数字 + 已确定数字的和 + (n - 1) * 排序后数组最后一个数字 小于target,则说明后面的数无论怎么选,加起来都一定小于 targettarget,所以剪掉(进行下一次循环)。
dfs模板解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { private: vector<vector<int>> ans; vector<int> myNums, subans; int tar, numSize; void DFS(int low, int sum) { if (sum == tar && subans.size() == 4) { ans.emplace_back(subans); return; } for (int i = low; i < numSize; ++i) { if (numSize - i < int(4 - subans.size())) //剪枝 return; if (i > low && myNums[i] == myNums[i - 1]) //去重 continue; if (i < numSize - 1 && sum + myNums[i] + int(3 - subans.size()) * myNums[i + 1] > tar) //剪枝 return; if (i < numSize - 1 && sum + myNums[i] + int(3 - subans.size()) * myNums[numSize - 1] < tar) //剪枝 continue; subans.emplace_back(myNums[i]); DFS(i + 1, myNums[i] + sum); subans.pop_back(); } return; } public: vector<vector<int>> fourSum(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); myNums = nums; tar = target; numSize = nums.size(); if (numSize < 4) return ans; DFS(0, 0); return ans; } };
|
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 583614868@qq.com
文章标题:leetcode入门题目第二弹
文章字数:467
本文作者:钟帅豪
发布时间:2020-12-07, 16:03:38
最后更新:2020-12-07, 17:46:04
原始链接:http://jhshz520.github.io/2020/12/07/leetcode入门题目第二弹/
版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。