classSolution { public: intcanCompleteCircuit(vector<int>& gas, vector<int>& cost){ int tank = 0; int startInd = 0; int total = 0; for(int i = 0; i < gas.size(); i++){ int store = gas[i] - cost[i]; total += store; tank += store; if(tank < 0){ startInd = i + 1; tank = 0; } } return total < 0 ? -1 : startInd; } };
你只更新了 minJumps[reach],但跳到
[i+1, reach] 的每一个点其实都可能是通过 i
达到的,因此都可能能更新为 minJumps[i] + 1。
时间复杂度仍是 O(n^2) 的最坏情况:
因为如果要更新 [i+1, reach]
中的所有点需要嵌套循环。
✅ 题解思路遍历过程:
每次跳跃的起点在哪里不重要,关键是这次最远跳跃是否可以次数内完成 *
对每个位置 i,更新
far = max(far, i + nums[i]),表示当前范围内下一跳能跳到的最远位置。
* 当遍历到边界 i == beg
时,说明当前跳跃结束,需要再跳一次,并更新新的边界
beg = far。 * 如果新的 beg
已经到达或超过数组末尾,则可以提前 break。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public: intjump(vector<int>& nums){ int minJump = 0; int beg = 0; int far = 0; if(nums.size() == 1)return0; for(int i = 0; i<nums.size();i++){ far = max(far, i + nums[i]); if(i == beg){ minJump++; beg = far; if(beg >= nums.size()-1)break; } } return minJump; } };
boolis_valid(int i, int j, int k, vector<vector<int>> board){ for(int a = 0; a < 9; a++){ if(board[i][a] == k)returnfalse; if(board[a][j] == k)returnfalse; } int i_start = (i / 3)*3; int j_start = (j / 3)*3; for(int a = i_start; a < (i_start+3); a++){ for(int b = j_start; b < (j_start+3); b++){ if(board[a][b] == k)returnfalse; } } returntrue; }