我是程序员;您好程先生;叫我序员就好了

每周一道算法题(四十二)

2018-01-21  本文已影响34人  CrazySteven

本周题目难度级别'Medium',使用语言'C'

题目:给你一组非负数组成的集合,然后从第一个索引中的数开始往下‘跳’,看能否‘跳’到最后一个数。eg:[2,3,1,1,4],第一个索引是2,所以从第一个索引开始‘跳’两步,当‘跳’到第二个索引3的时候又能跳‘3’步,很显然能够跳完。再eg:[3,2,1,0,4],第一个索引是3,从第一个索引开始‘跳’3步,当跳到0的时候,前面的3,2,1,0都已经跳完,就不能跳了,所以返回false。

思路:就是跳一跳么,一个索引一个索引的走,第一个索引能跳几步就往下继续跳,跳到下一个索引的时候更新所能够跳的步数,看最后能否跳完。不难,看代码吧:

bool canJump(int* nums, int numsSize) {
    //如果只有一个数,直接返回true(0也是true)
    if (numsSize == 1) return true;
    //获取能够跳的步数
    int temp = nums[0];
    //从第一个索引开始遍历
    int i = 0;
    //能跳的步数不为0就继续跳
    while (temp != 0) {
        //当跳完了集合返回true
        if (nums[i] +i >= numsSize - 1) return true;
        //步数减一
        temp--;
        //跳到下一个索引
        i++;
        //更新能跳的步数
        if (temp < nums[i]) temp = nums[i];  
    }
    return false;
}

效率还行吧,while可以换成for,for一般用于已知遍历次数的,while一般用于未知遍历次数的,这个题明显的知道最大遍历次数不超过numsSize,所以用for更好些,我就不改了。另外这个题用到了“贪心算法”也叫“贪婪算法”,有兴趣的小伙伴可以自己了解下。。。

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

上一篇 下一篇

猜你喜欢

热点阅读