每個階段都選擇局部最優,算法終止時,希望局部最優=全局最優,如果不相等,則得到的是一個次最優解。
L55. canJump
/**
* 給出一組非負數,每個數的意思是能跳幾步,然後看能不能跳到最後
* @param nums
* @return
*/
public boolean canJump(int[] nums) {
//貪心算法,從第一個位置,記錄能達到的最遠距離
int len = nums.length-1;
int curMax = nums[0];
for(int i=0; i<=curMax; i++){ //這裏curMax,是能走到的最遠距離
if(nums[i]+i >= len) return true;
curMax = Math.max(curMax,nums[i]+i);
}
return false;
}
L45.Jump2
/** 順藤摸瓜
* 求跳到最後的最少的跳躍次數
* @param nums
* @return
*/
public int jump(int[] nums) {
int end = 0; //能跳到的最後的邊界
int maxPos = 0;
int steps = 0;
for(int i=0;i<nums.length-1;i++){
//找能跳的最遠的
maxPos = Math.max(nums[i]+i,maxPos);
if(end == i){ //如果已經跳到本次邊界,則進行更新,否則繼續遍歷,找跳的最遠的max
end = maxPos;
steps++;
}
}
return steps;
}
/**
* 順瓜摸藤
* @param nums
* @return
*/
public int jump2(int[] nums){
int pos = nums.length -1;//當前指向的位置
int steps = 0;
while (pos !=0){
for(int i=0; i< pos;i++){
if(nums[i]+i >= pos){
pos = i;
steps++;
break;
}
}
}
return steps;
}