leetcode求峰值,js实现
原题:

最开始是照着提示的思路进行,中规中矩,用时64ms
/**
* @param {number[]} nums
* @return {number}
*/
var findPeakElement = function(nums) {
let i=0;
let j=nums.length-1;
let nums[-1]=nums[0]-1;
let nums[nums.length]=nums[nums.length-1]-1;
if(j===0) return 0;
else if(j===1) return nums[0]>nums[1] ? 0 : 1;
else{
while(i<=j){
if(nums[i]>nums[i-1] && nums[i]>nums[i+1]){
return i;
}else{
i++
}
if(nums[j]>nums[j-1] && nums[j]>nums[j+1]){
return j;
}else{
j--;
}
}
}
};
然后想着优化,对着一个数组反复琢磨,发现一个规律:
nums.length=0,1,2不谈,从nums.length>3开始,i=0,如果nums[i]>nums[i+1],直接得出第一个峰值;如果nums[i]<nums[i+1]则说明nums[i]不是峰值,而这恰恰就是关键,既然nums[i]不是峰值,必然有nums[i+1]>nums[i],那么当i=2的时候,就可以省略一次比较了,优化如下:
/**
* @param {number[]} nums
* @return {number}
*/
var findPeakElement = function(nums) {
let i=0;
let j=nums.length-1;
if(j===0) return 0;
else if(j===1) return nums[0]>nums[1] ? 0 : 1;
else{
while(i<=j){
if(nums[i]>nums[i+1]){
return i;
}else{
i++
}
if(nums[j]>nums[j-1]){
return j;
}else{
j--;
}
}
}
};
不错了,用时60ms,那么还可以继续优化吗?
当然可以,在运行过程中,碰到return就直接结束了,那么不需要那么多的if-else
/**
* @param {number[]} nums
* @return {number}
*/
var findPeakElement = function(nums) {
let i=0;
let j=nums.length-1;
if(j===0) return 0;
if(j===1) return nums[0]>nums[1] ? 0 : 1;
while(i<=j){
if(nums[i]>nums[i+1]){
return i;
}
else{
if(nums[j]>nums[j-1]){
return j;
}
i++;
j--;
}
}
};
用时52ms,到此优化结束
leetcode求峰值,js实现的更多相关文章
- LeetCode 算法题解 js 版 (001 Two Sum)
LeetCode 算法题解 js 版 (001 Two Sum) 两数之和 https://leetcode.com/problems/two-sum/submissions/ https://lee ...
- leetcode 求一个字符串的最长回文子串
最长回文子串问题:给定一个字符串,求它的最长回文子串长度.如果一个字符串正着读和反着读是一样的,那它就是回文串. 给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最 ...
- leetCode(寻找峰值)-二分查找
题目: 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返回任何一个峰 ...
- [LeetCode]求两个链表的焦点--Intersection of Two Linked Lists
标题题目地址 1.解题意 求解两个链表的焦点,这个交点并不是焦点的值相等,而是需要交点之后的数据是完全相等的. 落实到java层面,就是交点处的对象是同一个对象即可. ps:我最开始没有读懂题目,然后 ...
- LeetCode求能够装得最多的水
费了半天劲还是没想出来,然后跑到网上找答案,明白了是怎么回事儿了,就是不知道为啥自己没有想出来. 明天再搞~~~ 国庆快乐~~~ 一年了~~~~~ 明年今日~~我会在哪儿 =====2017.9.30 ...
- LeetCode -- 求字符串数组中的最长公共前缀
题目描写叙述: Write a function to find the longest common prefix string amongst an array of strings.就是给定1个 ...
- LeetCode 求众数 II
题目链接:https://leetcode-cn.com/problems/majority-element-ii/ 题目大意: 略. 分析: k个一起删, 最后check一下即可. 代码如下: #d ...
- 《高性能javascript》一书要点和延伸(下)
第六章 快速响应的用户界面 本章开篇介绍了浏览器UI线程的概念,我也突然想到一个小例子,这是写css3动画的朋友都经常会碰到的一个问题: <head> <meta charset=& ...
- lodash源码(2)
1.flatten 对深层嵌套数组的抹平 _.flatten([1, [2, 3, [4]]]);* // => [1, 2, 3, [4]]** // using `isDeep`* _.fl ...
随机推荐
- 章节十四、5- web页面的截图
一.以雅虎网站为例,当我们在登录时,输入错误的用户名然后点击“下一步”,用户名输入框会提示红色字体,这个时候我们就将页面进行截图. http://commons.apache.org/proper/c ...
- emacs cedet
用emacs写c或者c++代码用的插件的配置.功能是能够代码补齐. (require 'package) (package-initialize) (add-to-list'package-archi ...
- Redsi缓存问题(穿透,击穿,雪崩)以及解决办法(分布式锁)【高并发问题】
Redsi常见问题 缓存在高平发和安全压力下的一些问题 缓存击穿 是某一个热点key在高并发访问的情况下,突然失效,导致大量的并发大金mysql数据库的情况 缓存穿透 是利用redis和mysql的机 ...
- 爬虫---Beautiful Soup 爬取图片
上一篇简单的介绍Beautiful Soup 的基本用法,这一篇写下如何爬取网站上的图片,并保存下来 爬取图片 1.找到一个福利网站:http://www.xiaohuar.com/list-1-1. ...
- jenkins自动打包生成docker镜像后自动发布并nginx代理访问
之前曾写过docker及jenkins基础使用 https://www.cnblogs.com/xiaochangwei/category/816943.html 现在搭建环境的功能为: 1.jen ...
- 初识v4l2(四)-------v4l2_open、v4l2_read、v4l2_write浅析
原文:https://blog.csdn.net/leesagacious/article/details/49995729 1.app: open("/dev/video0&quo ...
- python中判断两个对象是否相等
#coding=utf-8#比较两个对象是否相等#python 2中使用cmp(),==,is#is 主要是判断 2 个变量是否引用的是同一个对象,如果是的话,则返回 true,否则返回 false. ...
- LeetCode 669. Trim a Binary Search Tree修剪二叉搜索树 (C++)
题目: Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so th ...
- java第三讲课后动手动脑及代码编写
1. 类就是类型,对象就是这种类型的实例,也就是例子.类是抽象的东西,对象是某种类的实实在在的例子.例如:车是一个类,汽车,自行车就是他的对象. 对象的定义方法? (1)对象声明:类名 对象名: (2 ...
- mongo db 去除 _class 字段
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.NoSuc ...