LeetCode刷题191119
博主渣渣一枚,刷刷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的更多相关文章
- LeetCode刷题专栏第一篇--思维导图&时间安排
昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...
- leetcode 刷题进展
最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多 前200的吃透了 足以应付非算法岗 ...
- LeetCode刷题指南(字符串)
作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- LeetCode刷题总结之双指针法
Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...
- Leetcode刷题记录(python3)
Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...
- LeetCode刷题总结-数组篇(上)
数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...
- LeetCode刷题总结-数组篇(中)
本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...
- LeetCode刷题总结-数组篇(下)
本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...
随机推荐
- Android4.4 RIL短信接收流程分析
最近有客户反馈Android接收不到短信,于是一头扎进RIL里面找原因.最后发现不是RIL的问题,而是BC72上报短信的格式不对,AT+CNMA=1无作用等几个小问题导致的.尽管问题不在RIL,但总算 ...
- 系统优化——建立linux回收站机制
前言: linux系统下的rm是不可挽回的,命令设计本身没有问题,问题在于我们通常非常的自信,执行的时候喜欢rm -rf,这样的话就非常危险了,在执行的时候如果执行命令不对,甚至是执行的目录不对,那么 ...
- IT兄弟连 HTML5教程 和页面布局有关的CSS属性
使用DIV+CSS对网页进行标准化布局前,除了要掌握盒子模型,还要掌握定位和浮动两个比较重要的概念,它们可以控制在页面上排列和显示元素的方式.一个盒子是装内容的区块,如果多个盒子组合在一起使用,再通过 ...
- Java基础语法04面向对象上-类-属性-方法-可变参数-重载-递归-对象数组
类 面向对象是一种思想,一般指将事务的属性与方法抽出总结为模板(类/class),处理事务时通过类创建/new出对象由对象的功能/方法去完成所要计算处理的事情. 面向过程:POP:以过程,步骤为主,考 ...
- Java实现抢红包功能
采用多线程模拟多人同时抢红包.服务端将玩家发出的红包保存在一个队列里,然后用Job定时将红包信息推送给玩家.每一批玩家的抢红包请求,其实操作的都是从队列中弹出的第一个红包元素,但当前的红包数量为空的时 ...
- python yield关键词使用总结
python yield关键词使用总结 by:授客 QQ:1033553122 测试环境 win10 python 3.5 yield功能简介 简单来说,yield 的作用就是把一个函数变成一个 ge ...
- MYSQL之事务篇
目录 事务概述 事务隔离级别 Read Uncommitted Read Committed Repeatable Read Serializable 事务概述 在引入事务之前我们先考虑银行转账的操作 ...
- [MySQL] mysql中bitmap的简单运用
bitmap就是在一个二进制的数据中,每一个位代表一定的含义,这样最终只需要存一个整型数据,就可以解释出多个含义.业务中有一个字段专门用来存储用户对某些功能的开启和关闭,如果是传统的思维,肯定是建一个 ...
- [Go] 解决golang.org模块无法下载的问题
使用GOPROXY环境变量解决proxy.golang.org无法访问问题 在/etc/profile中增加 export GOPROXY=https://goproxy.cn windows下使用 ...
- pytest系列(四)- pytest+allure+jenkins - 持续集成平台生成allure报告
pytest是什么 pytest是python的一款测试框架,拥有unittest的功能并比它更丰富. allure是什么 有非常多的优秀的测试框架,但却是有非常少优秀的报告工具可以展示非常清楚的用例 ...