贪心算法

引:https://blog.csdn.net/yanerhao/article/details/70162902
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择,贪心策略使用的前提是局部最优能导致全局最优。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。
贪心算法的基本思路:
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。

Jump Game

Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A = [2,3,1,1,4], return true.
A = [3,2,1,0,4], return false.

[LeetCode] Jump Game II 跳跃游戏之二

Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Your goal is to reach the last index in the minimum number of jumps.
For example:
Given array A = [2,3,1,1,4]
The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

bool cam1(vector<int>data)
{
    int n = data.size();
    int maxjump = 0;
    for (int i = 0; i < n; ++i)
    {
        if (i > maxjump || maxjump >= n - 1)
            break;
        maxjump = max(maxjump, i + data[i]); 
    }
    return maxjump >= (n - 1);
}
int cam2(vector<int>data)
{
    int n = data.size();
    int maxjump = 0;
    int last = 0;
    int step = 0;
    for (int i = 0; i <= maxjump && maxjump < n; ++i)
    {
        if (i > last)
        {
            step++;
            last = maxjump;
        }
        maxjump = max(maxjump, data[i] + i);
    }
    return maxjump >= n - 1 ? step : 0;
}

int main()
{
    int n;
    cin >> n;
    vector<int>data(n);
    for (int i = 0; i < n; ++i)
        cin >> data[i];
    cout << cam2(data) << endl;
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值