程序员面试金典 - 面试题 16.24. 数对和(双指针/哈希map)
生活随笔
收集整理的這篇文章主要介紹了
程序员面试金典 - 面试题 16.24. 数对和(双指针/哈希map)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 排序+雙指針
- 2.2 哈希map
1. 題目
設計一個算法,找出數組中兩數之和為指定值的所有整數對。一個數只能屬于一個數對。
示例 1: 輸入: nums = [5,6,5], target = 11 輸出: [[5,6]]示例 2: 輸入: nums = [5,6,5,6], target = 11 輸出: [[5,6],[5,6]]提示: nums.length <= 100000來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/pairs-with-sum-lcci
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
2.1 排序+雙指針
時間復雜度O(nlog?n)O(n \log n)O(nlogn)
class Solution { public:vector<vector<int>> pairSums(vector<int>& nums, int target) {sort(nums.begin(), nums.end());int i = 0, j = nums.size()-1;vector<vector<int>> ans;while(i < j){if(nums[i]+nums[j]== target)ans.push_back({nums[i++],nums[j--]});else if(nums[i]+nums[j] < target)i++;elsej--;}return ans;} };308 ms 45.9 MB
2.2 哈希map
2次掃描,時間復雜度O(n)O(n)O(n)
class Solution { public:vector<vector<int>> pairSums(vector<int>& nums, int target) {unordered_map<int,int> m;for(int n : nums)m[n]++;vector<vector<int>> ans;for(int i = 0; i < nums.size(); i++){if(m[nums[i]] && m[target-nums[i]]){if((nums[i] == target-nums[i]) && m[nums[i]] <= 1)continue;//相等情況需要數量大于等于2ans.push_back({nums[i],target-nums[i]});m[nums[i]]--;m[target-nums[i]]--;}}return ans;} };356 ms 59.8 MB
- 優化上面哈希法,只需一次掃描
316 ms 59.8 MB
總結
以上是生活随笔為你收集整理的程序员面试金典 - 面试题 16.24. 数对和(双指针/哈希map)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1029. 两地调度(
- 下一篇: LeetCode 1003. 检查替换后