贪心算法总结及LeetCode经典题目解答

贪心算法

贪心算法的定义:
在么一个阶段都选取当前阶段的最优选择,同时不考虑后续的决策影响。

贪心算法的要素:
**·**贪心选择性质:
全局最优可以通过一系列的局部最优来求解
同时将问题通过一系列的局部最优得到了简化,同时进行求解。
**·**最优子结构:
原问题的最优解包含着子问题的最优解
这意味着可以通过对子问题的求解构建规模更大的问题。

LeetCode55跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。
示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
思路:从后往前遍历,每一个元素的值应该保证大于等于1,这样才能保证至少可以实现一步一步到达最后,如果最后到达开始位置,有出现该位置的值小于1步的就返回false。

 public boolean canJump(int[] nums) {
        int len=nums.length;
        int flag=1;
        for(int i=len-2;i>=0;i--){
            if(nums[i]>=flag){
                flag=1;
            }
            else{
                flag++;
            }
            if(i==0&&flag>1){
                return false;
            }
        }
        return true;
    }

LeetCode45跳跃游戏II
给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

思路:此题已经保证在可以从头跳到最后一步了,那么应该从开始,每次在能跳跃的范围内找到下一个能跳跃的最大范围

if(nums.length <= 1){
            return 0;
        }
        int index,max = 0;
        int step = 0,i= 0;
        while(i < nums.length){
        	//如果能直接一步走到最后,直接步数+1结束
            if(i + nums[i] >= nums.length - 1){
            	step++;
            	break;
            }
            max = 0;//每次都要初始化
            index = i+1;//记录索引,最少前进1步
            for(int j = i+1; j-i <= nums[i];j++){//搜索最大步长内行走最远的那步
                if(max < nums[j] + j-i){
                    max = nums[j] + j-i;//记录最大值
                    index = j;//记录最大值索引
                }
            }
            i = index;//直接走到能走最远的那步
            step++;//步长+1
        }
        return step;


你可能感兴趣的:(算法)