leetcode Jump Game I II待续贪心看不懂啊!!!

25629 ワード

次はこの2つの問題の解法です.
参考ブログ:http://blog.csdn.net/loverooney/article/details/38455475
自分で書いた第一題(TLE):

 1 #include<iostream>

 2 #include<vector>

 3 

 4 using namespace std;

 5 

 6 bool canJump(vector<int>& nums) 

 7 {

 8     int L = nums.size();

 9     bool *flag = new bool[L];

10     for (int i = L - 2; i >= 0; i--)

11     {

12         int right = i + nums[i];

13         if (right >= L - 1)

14             flag[i] = true;

15         else

16         {

17             flag[i] = false;

18             for (int j = i + 1;j<L&& j < i + nums[i]; j++)

19             {

20                 if (flag[j] == true)

21                 {

22                     flag[i] = true;

23                     break;

24                 }

25             }

26         }

27     }

28     return flag[0];

29 }

30 

31 int main()

32 {

33     vector<int> a = { 3, 2, 1, 0, 4 };

34     cout << canJump(a) << endl;

35 }

View Code
欲張りはstepで現在到達可能な最も遠い位置を維持し、毎回のiはこの最も遠い位置以内にいなければならず、いなければreturn falseを前進できないことを示す.
コード:

 1 #include<iostream>

 2 #include<vector>

 3 

 4 using namespace std;

 5 

 6 bool canJump(vector<int>& nums) 

 7 {

 8     int L = nums.size();

 9     int step = 0;

10     for (int i = 0; i <= step; i++)

11     {

12         if (nums[i] + i > step)

13             step = nums[i] + i;

14         if (step >= L - 1)

15             return true;

16     }

17     return false;

18 }

19 

20 int main()

21 {

22     int a[] = { 3, 2, 1, 0, 4 };

23     cout << canJump(vector<int>(a, a+5)) << endl;

24 }

View Code
2番目の問題:
BFS解法(MLE):

 1 #include<vector>

 2 #include<iostream>

 3 #include<queue>

 4 

 5 using namespace std;

 6 

 7 typedef struct Node

 8 {

 9     int index;

10     int jumpNo;

11     Node(int index, int jumpNo) :index(index), jumpNo(jumpNo){};

12 }Node;

13 

14 //    BFS

15 int jump(vector<int>& nums) 

16 {

17     int i = 0; 

18     int L = nums.size();

19     queue<Node> que;

20     que.push(Node(i,0));

21     while (!que.empty())

22     {

23         Node now = que.front();

24         que.pop();

25         for (i = now.index + 1; i <= nums[now.index] + now.index; i++)

26         {

27             if (nums[i]+now.index >= L - 1)

28             {

29                 return now.jumpNo+1;

30             }

31             else

32                 que.push(Node(i,now.jumpNo+1));

33         }

34     }

35     return -1;

36 }

37 

38 int main()

39 {

40     vector<int> a = { 8, 3, 1, 1, 4 };

41     cout << jump(a) << endl;

42 }

View Code
自分で書いたのもMLE:
 1 #include<iostream>

 2 #include<vector>

 3 #include<queue>

 4 

 5 using namespace std;

 6 

 7 typedef struct Node

 8 {

 9     int val;    //         

10     int len;    //     len    

11     int index;  //       

12     Node(int val,int index,  int len) :val(val), index(index),len(len){};

13     Node(){};

14 }Node;

15 

16 int jump(vector<int>& nums) 

17 {

18     int L = nums.size();

19     Node* nodeArray = new Node[L];

20     for (int i = 0; i < L; i++)

21     {

22         nodeArray[i].val = nums[i];

23         nodeArray[i].index = i;

24         nodeArray[i].len = 0;

25     }

26     //vector<bool> visited(L,false);

27     queue<Node> visiteQueue;

28     nodeArray[0].len = 0;

29     visiteQueue.push(nodeArray[0]);

30     while (!visiteQueue.empty())

31     {

32         Node temp = visiteQueue.front();

33         int index = temp.index;

34         int canStep = temp.val;

35         for (int i = index + 1; i <= index + canStep; i++)

36         {

37             if (nodeArray[i].index+nodeArray[i].val>=L-1)

38             {

39                 return temp.len + 2;

40             }

41             Node nextNode(nodeArray[i].val,nodeArray[i].index, temp.len + 1);

42             visiteQueue.push(nextNode);

43         }

44         visiteQueue.pop();

45     }

46     return false;

47 }

48 

49 int main()

50 {

51     vector<int> a = { 2,1,3, 1, 1, 4,1,1,1,1};

52     cout << jump(a) << endl;

53 }

メモリが超過しないBFS:http://www.myext.cn/c/a_4468.html
動的計画解法(TLE):
 1 #include<iostream>

 2 #include<vector>

 3 

 4 using namespace std;

 5 

 6 int jump(vector<int>& nums) 

 7 {

 8     int L = nums.size();

 9     int *dp = new int[L];

10     dp[0] = 0;

11     for (int i = 1; i < L; i++)

12     {

13         int min = INT_MAX;

14         for (int j = 0; j < i; j++)

15         {

16             if (nums[j] + j >= i&&dp[j]+1<min)

17             {

18                 min = dp[j] + 1;

19             }

20         }

21         dp[i] = min;

22     }

23     for (int i = 0; i < L; i++)

24         cout << dp[i] << endl;

25     return dp[L - 1];

26 }

27 

28 int main()

29 {

30     vector<int> a = { 2, 3, 1, 1, 4 };

31     cout << jump(a) << endl;

32 }

貪欲な解法: