LeetCode Jump Game II
class Solution { private: vector<long> sum; vector<long> step; set<int> can; public: int jump(int A[], int n) { step.clear(), sum.clear(), can.clear(); step.resize(n, INT_MAX), sum.resize(n, 0); int jmp = A[0]; can.insert(n - 1); step[n - 1] = 0; for (int i = n - 2; i>= 0; i--) { jmp = A[i]; if (i + jmp >= n - 1) { sum[i] = sum[i + 1] + 1; can.insert(i); continue; } int region = sum[i + 1] - sum[i + jmp + 1]; if (region > 0) { sum[i] = sum[i + 1] + 1; can.insert(i); } else { sum[i] = sum[i + 1]; } } if (can.size() > 1 && (jmp >= n-1 || sum[0] - sum[jmp] > 0)) { can.insert(0); } int cur_jmp_to; int pre_jmp_to = n-1 + A[n - 1]; for (int i = n - 2; i >= 0; i--) { cur_jmp_to = i + A[i]; int min_step = INT_MAX; if (cur_jmp_to >= pre_jmp_to) { min_step = step[i + 1] - 1; if (min_step < 0) min_step = 0; for (int j = pre_jmp_to; j < n && j <= cur_jmp_to; j++) { if (step[j] < min_step) min_step = step[j]; } } else if (A[i] > 0){ set<int>::iterator lower = can.lower_bound(i+1); set<int>::iterator upper = can.upper_bound(cur_jmp_to); while (lower != upper) { if (step[*lower] < min_step) min_step = step[*lower]; lower++; } } step[i] = min_step == INT_MAX ? INT_MAX : min_step + 1; pre_jmp_to = cur_jmp_to; } return step[0]; } };
状态不佳,错了好多,100ms+,感觉好吃力。想起以前高中做数学题那会儿,看叼的人两三下把题目做出来了,自己写满一页还没算出来,真是tmd的不是滋味,不找规律,强来就是这样的结果,我tmd已经看穿了。
时间O(n),空间O(1)算法参考:http://www.cnblogs.com/zhuli19901106/p/3568216.html
// cloned from zhuli class Solution { public: int jump(int A[], int n) { if (A == nullptr || n <= 0) { return -1; } else if (n == 1) { return 0; } int last_pos, this_pos; int i; int result; last_pos = 0; this_pos = 0; result = 0; for (i = 0; this_pos < n - 1; ++i) { if (i > this_pos) { return -1; } if (i + A[i] > this_pos) { if (i > last_pos) { last_pos = this_pos; ++result; } this_pos = i + A[i]; } } return result + 1; } };
时间上快了一倍50ms+
第二轮:
卧槽,代码写的太烂简直不忍直视
class Solution { public: /** * @param A: A list of lists of integers * @return: An integer */ int jump(vector<int> A) { // wirte your code here int count = 0; int len = A.size(); int sofar = 0; while (sofar < len) { count++; int end = min(sofar + A[sofar] + 1, len); if (end >= len) { break; } int maxrange = 0; for (int i = sofar; i < end; i++) { if (A[i] + i > maxrange) { maxrange = A[i] + i; sofar = i; } } } return count; } };
更简单的方法:
class Solution { public: /** * @param A: A list of lists of integers * @return: An integer */ int jump(vector<int> A) { // wirte your code here int count = 0; int len = A.size(); int sofar = 0; int jpfar = 0; for (int i = 0; i < len; i++) { if (jpfar < i) { count++; jpfar = sofar; } sofar = max(sofar, A[i] + i); } return count; } };
参见:http://www.cnblogs.com/ganganloveu/p/3761715.html