力扣算法题—045跳跃游戏二

 1 #include "000库函数.h"
 2 
 3 
 4 //考虑当前最远能到什么地方,例如2, 3, 1, 1, 4,
 5 //首先只考虑a[0] = 2,即最远可以到a[2],然后从1到2中找下一个可到的最远点,
 6 //即a[1]可以到达a[4],此时找到结果,步数记录为2。若接着考虑,
 7 //下一次应该从3 - 4里面找一个最远即a[4]可达a[8](4 + 4), 
 8 //再下一次从5 - 8中找最远
 9 //20ms
10 class Solution {
11 public:
12     int jump(vector<int>& nums) {
13         if (nums.size() < 2)return 0;
14         int min = 0;
15         int a = 0, b = 0 + nums[0];//第一步和下一步的坐标
16         while (a < nums.size() - 1) {
17             min++;    
18             int s = MAX(nums, a + 1, b);    //在a,b中找到最远距离
19             a = b;
20             b = s;
21         }
22         return min;
23     }
24     int MAX(vector<int>& nums, int s, int t) {
25         int max = s + nums[s];
26         for (; s < nums.size() && s <= t; ++s) {
27             if (max < s + nums[s])
28                 max = s + nums[s];
29         }
30         return max;
31     }
32 };
33 
34 //博客解法  20ms
35 //解法的思想一样,找到跳的最远的那个
36 class Solution {
37 public:
38     int jump(vector<int>& nums) {
39         int res = 0, n = nums.size(), i = 0, cur = 0;
40         while (cur < n - 1) {
41             ++res;
42             int pre = cur;
43             for (; i <= pre; ++i) {
44                 cur = max(cur, i + nums[i]);
45             }
46             if (pre == cur) return -1; // May not need this
47         }
48         return res;
49     }
50 };
51 
52 
53 class Solution {
54 public:
55     int jump(vector<int>& nums) {
56         int res = 0, n = nums.size(), last = 0, cur = 0;
57         for (int i = 0; i < n - 1; ++i) {
58             cur = max(cur, i + nums[i]);
59             if (i == last) {
60                 last = cur;
61                 ++res;
62                 if (cur >= n - 1) break;
63             }
64         }
65         return res;
66     }
67 };
68 void T045() {
69     Solution s;
70     vector<int>v;
71     v = { 5,5,3,2,1,0,2,3,3,10,0,0 };
72     cout << s.jump(v) << endl << "**************" << endl;
73     v = { 2,0,2,4,6,0,0,3};
74     cout << s.jump(v) << endl << "**************" << endl;
75     v = { 2,3,0,1,4 };
76     cout << s.jump(v) << endl << "**************" << endl;
77     v = { 2,3,1,1,4 };
78     cout << s.jump(v) << endl << "**************" << endl;
79 }

 

posted @ 2019-03-26 16:30  自由之翼Az  阅读(380)  评论(0编辑  收藏  举报