leetcode求峰值,js实现
程序员文章站
2022-04-30 19:52:07
原题: 最开始是照着提示的思路进行,中规中矩,用时64ms 然后想着优化,对着一个数组反复琢磨,发现一个规律: nums.length=0,1,2不谈,从nums.length>3开始,i=0,如果nums[i]>nums[i+1],直接得出第一个峰值;如果nums[i]
原题:
最开始是照着提示的思路进行,中规中矩,用时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实现
-
C++实现LeetCode(50.求x的n次方)
-
C++实现LeetCode(162.求数组的局部峰值)
-
C++实现LeetCode( 69.求平方根)
-
C++实现LeetCode(172.求阶乘末尾零的个数)
-
C++实现LeetCode(124.求二叉树的最大路径和)
-
【急求】CDN中实现 CSS/JS 自动压缩的议案
-
一个iframe实现长轮询,通过PHP查询数据库并用JS更新页面内容的程序,问题是并不是每一条MYSQL的INSERT消息都能显示到页面,求帮忙分析下哪里有问题
-
一个iframe实现长轮询,通过PHP查询数据库并用JS更新页面内容的程序,问题是并不是每一条MYSQL的INSERT消息都能显示到页面,求帮忙分析下哪里有问题
-
leetcode求峰值,js实现