坚持每日一题 7.15
坚持持续学习,每日一题慢慢把之前都学过的算法捡回来,不断巩固,希望自己能坚持下去。
题目:https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76?tpId=295&tqId=2227748&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
首先没有想到分治法,分治法:分治即“分而治之”,“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题,子问题继续按照这样划分,直到问题可以被轻易解决;“治”指的是将子问题单独进行处理。经过分治后的子问题,需要将解进行合并才能得到原问题的解,因此整个分治过程经常用递归来实现。
想象一下,如果有上坡那么一定会有下坡,如果mid < 右边元素那么一定是在上坡,即l = mid + 1,当mid > mid + 1的时候标明已经再下坡,r = mid及时标记顶峰的位置,最后可以得到答案
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int findPeakElement (int[] nums) { // write code here int l = 0; int r = nums.length - 1; while(l < r){ int mid = (l + r) / 2; if(nums[mid] > nums[mid + 1]) r = mid; else l = mid + 1; } return r; } }
代码是比较简单的二分,不过条件要注意保留山峰的位置。