博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教。题目及解法来自于力扣(LeetCode),传送门

算法:

给定一个非负整数数组,你最初位于数组的第一个位置。

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

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

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

  二狗脑子不好使。我的思路大致是这样,从倒数第二位逆序检查数组,如果存在这样的值-----这个值的索引index + 1 +这个值 》= 整个数组的长度,那么从index这个值是肯定可以走到结尾的,也就是说可以返回true了。 这样有一个问题,就是我们可能找到多个这样的index。这里其实只要取最小值就可以了。因为如果能从【0】走到后面的满足条件的index,也一定能走到最小的这个index。

  这样我们就可以稍微优化一下,也就是说从index=0开始找,一直循环整个数组,如果我们发现了满足条件的index,就可以缩短整个数组的长度,然后递归的查找。如果最终index为0了,我们就能确定这样的数组是满足条件的。上代码:

public class _55
{
public bool CanJump(int[] nums)
{
if (nums.Length <= )
{
return true;
} return Check(nums);
} private bool Check(int[] nums)
{ var index = -; for (int i = ; i < nums.Length-; i++)
{
if (i + + nums[i] >= nums.Length && i <= nums.Length-)
{
index = i;
break;
}
} if (index == - || index + > nums.Length)
{
return false;
}
else if (index == )
{
return true;
}
else
{
return Check(nums.Take(index + ).ToArray());
}
}
}

  然而,很不幸,上面的代码实在太low了。一是花费了很多精力处理边界情况与返回的结果,不优雅。二是被最后的测试用例[1,1,1,1,1,.........很多很多个1....1,1,1,1,1,]直接干趴下了,运行超时。还是不能随意用递归呀。即使不超时,时间复杂度也高的吓人。

  看完了low的解法,我们来瞅一个不low的。年兄的解法:

LeetCode 55: 跳跃游戏

题目内容

给定一个非负整数数组,你最初位于数组的第一个位置。

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

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

示例 1:

输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。 示例 2:

输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

本题的解题关键在于,重新理解一遍题目,忽视题目中的跳跃两个字,一步一步走,因为无论如何,你都必须遍历一遍数组才能了解所有的信息,所以“跳跃”是没有意义的。

除了路要一步一步走,每次只走一格,还有饭要一口一口吃。假想每个格点的值就是几口饭,一口饭供你走一格,也就符合了题目描述每个元素代表你在该位置可以跳跃的最大长度。

下面就很简单了,每当你走到下一个格点,你就要做一个决定,是用身上剩下的几口饭继续走下去,还是用新格点的这几口饭走下去。当然是选多的那个。

所以解题思路就是这样的:

首先,你的坐标index位于起点0,元素值temp为起点的值nums[0]。之后每走一步index+1,元素值temp-1,然后进行判断,当前元素值temp和现在坐标index的元素值nums[index]谁大,选择大的那个为新的temp。当temp减到0时,无法继续前进,如果尚未到达终点,则失败。否则成功。

代码如下:

class Solution {
public boolean canJump(int[] nums) {
int temp = nums[];
int index = ;
while (index < nums.length- && temp >= ) {
if (temp < nums[index]) {
temp = nums[index];
}
index += ;
temp -= ;
}
if (temp < ) {
return false;
}
else {
return true;
}
}
}

这个算法效率理论上是最高的,时间复杂度为数组长度,空间复杂度为常数。结果非常好,应该是最快的了。

LeetCode刷题191119的更多相关文章

  1. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  2. leetcode 刷题进展

    最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多  前200的吃透了 足以应付非算法岗 ...

  3. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

  4. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  5. LeetCode刷题总结之双指针法

    Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...

  6. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

  7. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  8. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  9. LeetCode刷题总结-数组篇(下)

    本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...

随机推荐

  1. 局域网地址为什么是192.168.X.X?为什么连上公司的VPN就上不了网?

    注:本文主要目的是给程序员讲述一些局域网/VPN的基本知识,并不涉及到具体的实操.关于如何安装VPN服务器.配置VPN客户端及修改Windows路由表等具体实操内容,请自行搜索. RFC 局域网地址为 ...

  2. Git 原理简谈

    Git 本身是一个对 reference 进行管理的数据库,reference 指的是对原始数据的引用.通过对原始数据的追踪,那么就可以做到对版本的控制.Git 使用一个 DAG 存储了整个的refe ...

  3. finger

    finger <username> 显示用户信息,包括用户的home目录,上一次登录的时间,默认shell等 finger XXXXX #输出: #Login: XXXXX Name: X ...

  4. C# 使用TopShelf实现Windows服务部署

    一.TopShelf介绍 topShelf是创建Windows服务的一种方式,可以方便管理应用服务,最大广泛应用于,数据实时接收,定时推送等. 二.TopShelf使用 1.安装 TopShelf程序 ...

  5. config-server-bus动态更新配置

    config-server用来搭建配置中心,而配置信息一般使用gitlab仓库来存储,这样在你的配置发生改变时,不需要从新打包,而如果使用native的试,则需要从新打一个config-server的 ...

  6. JavaScript for 、for...of 、for...in 等 iteration 效率测试

    由于不同浏览器,不同版本性能不一,且控制台本质是是套用了一大堆eval,沙盒化程度高,所以需使用node环境测试来提高准确性 // 准备待测数组 const NUM = 1e7; let arr = ...

  7. MySQL解惑——GROUP BY隐式排序

    MySQL中GROUP BY隐式排序是什么概念呢? 主要是其它RDBMS没有这样的概念,如果没有认真了解过概念,对这个概念会感觉有点困惑,我们先来看看官方文档的介绍: 官方文档MySQL 5.7 Re ...

  8. Java之Collection接口(单列集合根接口)

    集合概述 集合到底是什么呢?集合:集合是java中提供的一种容器,可以用来存储多个数据 集合和数组既然都是容器,它们有啥区别呢? 区别1: 数组的长度是固定的. 集合的长度是可变的. 区别2:  数组 ...

  9. TopCoder12727 「SRM590Hard」FoxAndCity 最小割离散变量模型

    问题描述 一张 \(N\) 个点无向图,边权都为 \(1\) ,添加若干条边,最小化 \(\sum\limits_{1 \le i \le n,i \in N_{+}}{(a_i-b_i)^2}\). ...

  10. Ubuntu16.04 GTX750安装CUDA9.0,Pytorch,Anaconda教程

    Ubuntu16 GTX750安装CUDA9.0,Pytorch,Anaconda教程 安装前警告 不要使用Ubuntu18! 不要使用Ubuntu18! 不要使用Ubuntu18! 务必重装成Ubu ...