leetcode 162. Find Peak Element | 162. 寻找峰值(待完善)

题目

https://leetcode.com/problems/find-peak-element/
leetcode 162. Find Peak Element | 162. 寻找峰值(待完善)

题解

看题目要求是 O(log n),想到每次删一半,但是写完之后才发现并不符合要求。。先将错就错吧,后面有空再完善下。

第一次比较次数为 n/2,第二次比较次数为 n/4,第三次8/n,…,总比较次数为 n/2+n/4+n/8+n/16+…= ?

根据《算法导论》“同时找最大最小元素的最小比较次数”的原理,也是每次删一半,即不重复的两两比较。

所以每次淘汰一半后,最后剩下的是最大值,也就是 Peak Element。

class Solution {
    public int findPeakElement(int[] nums) {
        ArrayList<Integer> list = new ArrayList<>();
        ArrayList<Integer> index = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            list.add(nums[i]);
            index.add(i);
        }
        while (list.size() != 1) {
            ArrayList<Integer> newList = new ArrayList<>();
            ArrayList<Integer> newIndex = new ArrayList<>();
            for (int i = 0; i < list.size() - 1; i += 2) { // 两两比较,每次扔掉一半
                if (list.get(i) > list.get(i + 1)) {
                    newList.add(list.get(i));
                    newIndex.add(index.get(i));
                } else {
                    newList.add(list.get(i + 1));
                    newIndex.add(index.get(i + 1));
                }
            }
            if (list.size() % 2 == 1) { // 奇数个数情况,简单起见,末尾元素无条件进入下一轮判断
                newList.add(list.get(list.size() - 1));
                newIndex.add(index.get(index.size() - 1));
            }
            list = newList;
            index = newIndex;
        }
        return index.get(0);
    }
}

leetcode 162. Find Peak Element | 162. 寻找峰值(待完善)

上一篇:162. 寻找峰值


下一篇:Leetcode1004 最大连续1的个数III 中等(滑动窗口)