给定一个非负整数数组 nums
,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
示例 1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
提示:
1 <= nums.length <= 3 * 104
0 <= nums[i] <= 105
C++ class Solution {public : bool canJump (vector<int >& nums) { int n = nums.size (); int res = 0 ; for (int i = 0 ; i < n; i ++) { if (i > res) return false ; res = max (res, i + nums[i]); } return true ; } };
给定一个长度为 n
的 0 索引 整数数组 nums
。初始位置为 nums[0]
。
每个元素 nums[i]
表示从索引 i
向前跳转的最大长度。换句话说,如果你在 nums[i]
处,你可以跳转到任意 nums[i + j]
处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]
。
示例 1:
输入: nums = [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4] 输出: 2
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
C++ class Solution {public : int jump (vector<int >& nums) { int res = 0 ; int begin = 0 ; int end = 1 ; while (end < nums.size ()){ int maxReach = 0 ; for (int i = begin; i < end; i ++){ maxReach = max (nums[i] + i, maxReach); } begin = end; end = maxReach + 1 ; res ++; } return res; } };
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points
,其中points[i] = [xstart, xend]
表示水平直径在 xstart
和 xend
之间的气球。你不知道气球的确切 y 坐标。
一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x
处射出一支箭,若有一个气球的直径的开始和结束坐标为 x``start
,x``end
, 且满足 xstart ≤ x ≤ x``end
,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。
给你一个数组 points
,返回引爆所有气球所必须射出的 最小 弓箭数 。
示例 1:
输入:points = 输出:2 解释:气球可以用2支箭来爆破: -在x = 6处射出箭,击破气球和。 -在x = 11处发射箭,击破气球和。
示例 2:
输入:points = 输出:4 解释:每个气球需要射出一支箭,总共需要4支箭。
示例 3:
输入:points = 输出:2 解释:气球可以用2支箭来爆破: - 在x = 2处发射箭,击破气球和。 - 在x = 4处射出箭,击破气球和。
提示:
1 <= points.length <= 105
points[i].length == 2
-231 <= xstart < xend <= 231 - 1
C++ class Solution {public : int findMinArrowShots (vector<vector<int >>& points) { sort (points.begin (), points.end ()); vector<vector<int >> res; for (auto e: points) { if (res.size () == 0 ) res.push_back (e); else if (e[0 ] > res.back ()[1 ]) res.push_back (e); else { res.back () = {max (e[0 ],res.back ()[0 ]), min (e[1 ],res.back ()[1 ])}; continue ; } } return res.size (); } };
给定一个区间的集合 intervals
,其中 intervals[i] = [starti, endi]
。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
示例 1:
输入: intervals = 输出: 1 解释: 移除 后,剩下的区间没有重叠。
示例 2:
输入: intervals = 输出: 2 解释: 你需要移除两个 来使剩下的区间没有重叠。
示例 3:
输入: intervals = 输出: 0 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
提示:
1 <= intervals.length <= 105
intervals[i].length == 2
-5 * 104 <= starti < endi <= 5 * 104
C++ class Solution {public : int eraseOverlapIntervals (vector<vector<int >>& intervals) { sort (intervals.begin (), intervals.end ()); vector<vector<int >> tmp; for (auto e: intervals) { if (tmp.size () == 0 ) tmp.push_back (e); else { if (e[0 ] >= tmp.back ()[1 ]) tmp.push_back (e); else tmp.back ()= {max (e[0 ],tmp.back ()[0 ]), min (e[1 ],tmp.back ()[1 ])}; } } return intervals.size () - tmp.size (); } };
给你一个字符串 s
。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s
。
返回一个表示每个字符串片段的长度的列表。
示例 :
输入:s = "ababcbacadefegdehijhklij" 输出:[9 ,7 ,8 ] 解释: 划分结果为 "ababcbaca" 、"defegde" 、"hijhklij" 。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde" , "hijhklij" 这样的划分是错误的,因为划分的片段数较少。
提示:
1 <= s.length <= 500
s
仅由小写英文字母组成
C++ class Solution {public : vector<int > partitionLabels (string s) { unordered_map<char , int > mp; for (int i = 0 ; i < s.size (); i ++) { mp[s[i]] = i; } vector<int > res; int start = 0 ; int end = 0 ; for (int i = 0 ; i < s.size (); i ++) { end = max (end, mp[s[i]]); if (i == end) { res.push_back (end - start + 1 ); start = i + 1 ; } } return res; } };
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1 ,3 ],[2 ,6 ],[8 ,10 ],[15 ,18 ]] 输出:[[1 ,6 ],[8 ,10 ],[15 ,18 ]] 解释:区间 [1 ,3 ] 和 [2 ,6 ] 重叠, 将它们合并为 [1 ,6 ].
示例 2:
输入:intervals = [[1,4],[4,5]] 输出:[[1,5]] 解释:区间 [1 ,4 ] 和 [4 ,5 ] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
C++ class Solution {public : vector<vector<int >> merge (vector<vector<int >>& intervals) { int n = intervals.size (); sort (intervals.begin (), intervals.end ()); vector<vector<int >> res; for (auto e: intervals) { if (res.size () == 0 ) res.push_back (e); else if (e[0 ]> res.back ()[1 ]) res.push_back (e); else { res.back ()[1 ] = max (e[1 ], res.back ()[1 ]); } } return res; } };