标签:index get ArrayList list Element newIndex add Peak 162
题目
https://leetcode.com/problems/find-peak-element/
题解
看题目要求是 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);
}
}
标签:index,get,ArrayList,list,Element,newIndex,add,Peak,162 来源: https://blog.csdn.net/sinat_42483341/article/details/118713632
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。