Leetcode题解(十四)
39、Combination Sum
题目
题目要求找出和为target的数字组合,并且每个整数可以多次使用。仔细思考可以发现,这道题目可以采用递归的方法来完成,比如举的例子,target=7,一开始可以选中2,并且2<7,因此,我只需要从[2,3,6,7]中寻找和为5(因为可以重复选择整数,因此需要从2开始而不是从下一个数3开始),如果后面的结果中找不出和为5,因此需要剔除当前选择的2,从下一个数3开始,按照这个递归继续执行。这样就把规模变小,代码如下:
class Solution { public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { vector<int> temp; vector<vector<int>> res; sort(candidates.begin(), candidates.end()); combinationSum(candidates,0,temp,res,target); return res; } void combinationSum(const vector<int>& candidates,int start,vector<int> &temp,vector<vector<int>> &res,int target) { if (0 == target) { res.push_back(temp); } for (int i=start;i<candidates.size();i++) { if(candidates[i]<=target) { temp.push_back(candidates[i]); combinationSum(candidates,i,temp,res,target-candidates[i]); temp.pop_back(); } } } };
--------------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------
40、Combination Sum II
题目
这道题和上一题差别不到,唯一的差别就是每个数至多使用一次,因此在之前的代码中需要做一次数据过滤,代码如下:
class Solution { public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { vector<int> temp; vector<vector<int>> res; sort(candidates.begin(), candidates.end()); combinationSum(candidates,0,temp,res,target); return res; } void combinationSum(const vector<int>& candidates,int start,vector<int> &temp,vector<vector<int>> &res,int target) { if (0 == target) { res.push_back(temp); } for (int i=start;i<candidates.size();i++) { if(candidates[i]<=target) { temp.push_back(candidates[i]); combinationSum(candidates,i+1,temp,res,target-candidates[i]); temp.pop_back(); while(i+1<candidates.size() && candidates[i] == candidates[i+1])//跳过后续相同的整数 i++; } } } };
----------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------------
41、First Missing Positive
题目
这道题目技巧性很强,在网上查看资料之后才知道如何解答。其解答的思路是:如果0<nums[index]<size,就将nums[index]这个值交换到对应下标所在的空间去。比如题目中的[3,4,-1,1],一开始index=0,其值为3,因此将3交换到index=2(3-1)去,变成[-1,4,3,1],代码如下:
class Solution { public: int firstMissingPositive(vector<int>& nums) { const int size = nums.size(); if(0 == size) return 1; int i,index; int temp; for (i = 0;i<size;i++) { index=i; while(nums[index]>0&&nums[index]<size&&nums[index] != index+1) { if(nums[nums[index]-1] == nums[index]) break; temp = nums[nums[index]-1]; nums[nums[index]-1] = nums[index]; nums[index] = temp; } } for(i = 0;i<size;i++) { if(i+1 != nums[i]) return i+1; } if(i == size) return size+1; } };
- IOS吐槽狂人:UITabelView全局表头和每个分区的表头和大小,设置区分表头的标题
- 相机模型详解
- 升级gcc4.4.7升级gcc4.8
- java集合——集合框架
- (my)sql 入门基础
- 【C#/OpenGL】基于DEM数据的3D地形绘制(基于CSGL)
- 页面统计
- vim查看及修改二进制
- 阿里云内网文件传输总结
- 有趣的keil MDK细节
- Remove Duplicate Letters leetCode316
- Mad Lib程序
- Android倒计时器——CountDownTimer
- Oracle定义常量和变量
- leetcode Add Two Numbers
- Android倒计时器——CountDownTimer
- CentOS6.5下编译安装mysql-5.6.27
- Removing NSLogs for distribution
- 关于数码管的消隐问题
- Java——协变数组和类型擦除以及泛型相关知识