刷题——4-16

每日一题:合并区间

https://leetcode-cn.com/problems/merge-intervals/

题目描述:

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

基本思路:这题其实很简单的,简单分析一下,如果两个区间可以被合并,无非就是后一个区间的起始位置位于前一个区间之中(包括端点)。那么,只需要把所有的区间根据起始位置按从小到大排序并进行一次遍历就行了。

代码如下:

vector<vector<int>> merge(vector<vector<int>>& intervals) {
	sort(intervals.begin(), intervals.end());
	vector<vector<int>>ans;
	int i = 0, j = 1;
	if (intervals.size() == 0 || intervals.size() == 1)
	{
		return intervals;
	}
	while (j < intervals.size())
	{
		if (intervals[i][1] > intervals[j][0])
		{
			if (intervals[i][1] < intervals[j][1]) {
				intervals[i][1] = intervals[j][1];
			}
			j++;
		}
		else {
			ans.push_back(intervals[i]);
			i = j;
			
		}
	}
	ans.push_back(intervals[i]);            //将最后一个区间加入到结果中去
	return ans;
}

下面就是今日主题回溯算法了,回溯算法的基本思想:试探

用大白话来解释回溯算法,就是试探,发现行不通,就回到上一步,换条路继续试探,知道找到最后符合要求的解即可。

2.组合总数

https://leetcode-cn.com/problems/combination-sum/

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

所有数字(包括 target)都是正整数。
解集不能包含重复的组合。 

示例:

 

基本思路:

因为今天的主题是回溯,所以我就尽量向这上面去想。对于给定的target,我们可以这样来看,第一步直接用数组中任意一个值去匹配,如果恰好相等,那么就把结果返回,如果大于target直接返回,小于,再使用随机的一个值去匹配。(说是随机,其实是循环从头到尾去匹配)。但是这样一看,就不是回溯,但我还是写出了这个代码:

void huisu0(vector<int> source,int i, int target, vector<vector<int>>& ans, vector<int>temp)
{
	if (target == 0)
	{
		ans.push_back(temp);
		return;
	}
	if (target < 0) return;
	for (; i<source.size();i++)
	{
		temp.push_back(source[i]);
		huisu0(source, i, target - source[i], ans, temp);
		temp.pop_back();
	}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
	vector<vector<int>>ans;
	vector<int>t;
	huisu0(candidates, 0, target, ans, t);
	return ans;
}

奇妙的是,我做完看其他人的题解的时候,特意找回溯看了一下,思路与我差不多(不过是减法),但是说是回溯,好吧,我承认我对回溯理解不够,咱读书少,咱也不知道是不是!下面贴一下他的减法代码:

// author:rmokerone
#include <iostream>
#include <vector>

using namespace std;

class Solution {
private:
    vector<int> candidates;
    vector<vector<int>> res;
    vector<int> path;
public:
    void DFS(int start, int target) {
        if (target == 0) {
            res.push_back(path);
            return;
        }
        for (int i = start;
             i < candidates.size() && target - candidates[i] >= 0; i++) {
            path.push_back(candidates[i]);
            DFS(i, target - candidates[i]);
            path.pop_back();
        }
    }

    vector<vector<int>> combinationSum(vector<int> &candidates, int target) {
        std::sort(candidates.begin(), candidates.end());
        this->candidates = candidates;
        DFS(0, target);

        return res;
    }

};
/*
作者:liweiwei1419
链接:https://leetcode-cn.com/problems/combination-sum/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值