Leetcode 45 - 跳躍遊戲2(貪心演算法)
題目:
給定一個非負整數陣列,你最初位於陣列的第一個位置。
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達陣列的最後一個位置。
假設你總是可以到達陣列的最後一個位置。
示例 1:
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。
從下標為 0 跳到下標為 1 的位置,跳1步,然後跳3步到達陣列的最後一個位置。
示例 2:
輸入: [2,3,0,1,4]
輸出: 2
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/jump-game-ii
分析:類似於Dijkstra演算法的變形,BFS廣度優先演算法
例:以 【2,3,1,1,4】陣列為例
此題就只找從開始下標為0-->n-1的最少邊數 顯然0-->1-->4 輸出為 2
1 #include <iostream> 2 #include <stdio.h> 3 #include<vector> 4 using namespace std; 5 class Solution { 6 public: 7 int jump(vector<int>& nums) { 8 int end=0; 9 int start=0;10 int max; // 最大逾越 11 int i; //記錄最大值,和下標 12 int time=0;//跳躍次數 13 while(end < nums.size()-1) //當end 下標大於陣列下標退出 14 { 15 max = end; 16 for(i=start;i<=end;i++) //相當於圖的BFS搜尋 取與父節點相鄰子節點中 下標與值和的最大者 17 { 18 if(nums[i]+i>max) 19 { 20 max = nums[i]+i; 21 } 22 } 23 start = end+1; //更新起點 24 end = max; //更新尾點 25 time++; 26 } 27 return time; 28 } 29 30 }; 31 int main(){ 32 int n,i,x; 33 Solution b; 34 cin>>n; 35 vector<int> a; 36 for(i=0;i<n;i++) 37 { 38 cin>>x; 39 a.push_back(x); 40 } 41 cout<<b.jump(a); 42 }
另外補充 vector 類用法
它是一種順序容器,支援隨機訪問。vector是一塊連續分配的記憶體,從資料安排的角度來講,和陣列極其相似,不同的地方就是:陣列是靜態分配空間,一旦分配了空間的大小,就不可再改變了;而vector是動態分配空間,隨著元素的不斷插入,它會按照自身的一套機制不斷擴充自身的容量。
vector的擴充機制:按照容器現在容量的一倍進行增長。vector容器分配的是一塊連續的記憶體空間,每次容器的增長,並不是在原有連續的記憶體空間後再進行簡單的疊加,而是重新申請一塊更大的新記憶體,並把現有容器中的元素逐個複製過去,然後銷燬舊的記憶體。這時原有指向舊記憶體空間的迭代器已經失效,所以當操作容器時,迭代器要及時更新。
1.push_back 在陣列的最後新增一個數據
2.pop_back 去掉陣列的最後一個數據
3.at 得到編號位置的資料
4.begin 得到陣列頭的指標
5.end 得到陣列的最後一個單元+1的指標
6.front 得到陣列頭的引用
7.back 得到陣列的最後一個單元的引用
8.max_size 得到vector最大可以是多大
9.capacity 當前vector分配的大小
10.size 當前使用資料的大小
11.resize 改變當前使用資料的大小,如果它比當前使用的大,者填充預設值
12.reserve 改變當前vecotr所分配空間的大小
13.erase 刪除指標指向的資料項
14.clear 清空當前的vector
15.rbegin 將vector反轉後的開始指標返回(其實就是原來的end-1)
16.rend 將vector反轉構的結束指標返回(其實就是原來的begin-1)
17.empty 判斷vector是否為空
18.swap 與另一個vector交換資料