【剑指 Offer 57. 和为s的两个数字 简单】【剑指 Offer 57 - II. 和为s的连续正数序列 简单】
【剑指 Offer 57. 和为s的两个数字 简单】
1. 题目描述
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
来源:力扣(LeetCode)
2. 思路
利用两个滑动指针,分别指向数组首尾,因为数组是递增的,因此可以根据当前首尾的和判断是前指针start前进,还是后指针end后退。
3. 代码
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int len = nums.size(); vector<int> res(2, 0); if(len < 2) return res; int start = 0, end = len -1; while(start < end) { int sum = nums[start] + nums[end]; if(sum == target) { res[0] = nums[start]; res[1] = nums[end]; return res; } else if(sum < target) { ++ start; } else{ --end; } } return res; } };
【剑指 Offer 57 - II. 和为s的连续正数序列 简单】
1. 题目描述
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
2. 思路
利用一个滑动窗口,因为数组递增,因此只需记录一个当前序列和并且比较当前序列和与target的大小关系便可判定是前指针前进(让当前和减小)还是后指针前进(让当前和增大)。
一个trick:前指针最大不超过target /2 + 1.
3. 代码
class Solution { public: vector<vector<int>> findContinuousSequence(int target) { vector<vector<int>> res; if(target < 2) return res; int start = 1, end = 2; int mid = target / 2 + 1; int curSum = 3; while(start < mid) { if(curSum == target) { vector<int> row; for(int i = start; i<=end;i++) row.push_back(i); res.push_back(row); end++; curSum += end; } else if(curSum < target) { end ++; curSum += end; } else{ curSum -= start; start ++; } } return res; } };