56. 合并区间
给二维数组按照第一个值排序 Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]))
把第一个小区间加入结果集res
for 所有的interval:
if 当前interval的左 > res最后一个区间的右:
当前interval加入res
else:
修改res最后一个区间的右,**一定要选两个区间右边界最大的那个值**
res.toArray(new int[res.size()][])
113. 路径总和 II
依旧是回溯+剪枝,就不重复了。
31. 下一个排列
这题有点难,参考的思路,这个可视化解法很厉害
for 从后往前:
查找第一个升序的相邻对(i,j),则(j,end)必定降序
for (j,end)从后向前:
找到第一个比nums[i]大的:nums[k]
将 [i] 和 [k]交换
(j,end)降序,所以把它变成升序
基于上面的思想,可以优化一下(j,end)那个部分,因为最后一步是 (j,end)变成升序,所以可以先(j,end)直接升序,再从里面找一个比[i]大的
for 从后往前:
if [i-1]<[i]: //(i,end)必定降序
(i,end)升序
for i:end:
if [k] > [i-1]:
交换
return 直接结束
Arrays.sort(nums) // 处理 [3,2,1]变成[1,2,3]的情况
return