39.组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
- dfs+回溯
34.在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
- 二分搜索。
128.最长连续序列
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
- 先Arrays.sort(nums)排序后再找,时间O(nlogn)或者O( n 2 n^2 n2)。
- 空间换时间,用HashSet记录nums数组。然后遍历HashSet用中心扩散法,把一个元素左边相连区间和右边相连区间的元素从HashSet中删去,并记录比较该区间长度。这里有一个坑,遍历HashSet过程中外层循环不能够写成for(Integer i:HashSet),因为里层要HashSet.remove()删去整个区间内元素,容器会报异常,遍历过程中不能够对容器添加删除。因此外层要用nums遍历。
for(int i:nums)
{
if(hashset.remove(i))
{
int curr=i,left =curr - 1, right = curr + 1;
while (hashset.remove(right)) right++;
while (hashset.remove(left)) left--;
res=right-left-1>res?right-left-1:res;
}
}