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 ...
随机推荐
- ReactNative: 使用AppReistry注册类
一.简介 每一个应用程序的运行都有一个入口文件或者入口函数,例如iOS中的使用UIApplicationMain类完成入口函数的实现,在React-Native中,AppRegistry类就肩负着这个 ...
- JavaScript实例:运动的小球
本篇博文通过制作一个小球运动动画的实例,来学习在HTML5的画布上实现动画制作的方法,同时理解面向对象程序设计的基本思想. 1.绘制小球 先在HTML页面中设置一个画布. <canvas id= ...
- mysql之行转列与列转行
mysql之行转列与列转行是数据查询的常见操作,以更好的来展示数据,下面就详细说说怎么实现. 行转列 行转列的话,就是将一条一条的行数据记录转换为一条列数据展示,一般来说是根据某一列来做汇总数据的操作 ...
- Mysql - 高可用方案之MMM(二)
一.概述 上一篇博客中(https://www.cnblogs.com/ddzj01/p/11535796.html)介绍了如何搭建MMM架构,本文将通过实验介绍MMM架构的优缺点. 二.优点 1. ...
- winform删除dataGridView列报异常:System.IndexOutOfRangeException:“索引 7 没有值
winform界面如下: using System; using System.Collections.Generic; using System.ComponentModel; using Syst ...
- How to: Use Both Entity Framework and XPO in a Single Application 如何:在单个应用程序中同时使用实体框架和 XPO
This topic demonstrates how to create a simple XAF application that uses both the Entity Framework ( ...
- Laravel实现大型商城网站之用户注册短信发送项目实战功能开发
确定短信运营商 我这里采用的云片,不过大家使用其它的也可以. 首先自己注册一个帐号,然后找到这个 点击开始接入,完成新手引导过程. 第二部的签名和模板必须填写,类似我下面填写的这样 值得注意的是这个模 ...
- dedecmsV5.7 任意文件上传漏洞修复
问题文件:在/include/dialog/select_soft_post.php文件 解决方法: 先找到这个文件/include/dialog/select_soft_post.php,找到大概7 ...
- uiautomatorviewer 报错 Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!
在进行自动化时经常需要使用到 uiautomatorviewer获取控件的各个属性,然后在脚本中通过各个控件的属性来操作. 如果使用的是uiautomator2的话,一般都是使用weditor这个来查 ...
- August 11th, 2019. Week 33rd, Sunday
Worry does not empty tomorrow of its sorrow. It empties today of its strength. 忧虑不会消除明天的痛苦,它只会削弱今天的力 ...