给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。 请你找到并返回这个整数 示例: 输入:arr = [1,2,2,6,6,6,6,7,10] 输出:6 提示:1 <= arr.length <= 10^4 0 <= arr[i] <= 10^5 https://leetcode-cn.com/problems/element-appearing-more-than-25-in-sorted-array/
这道题是找出数组中重复次数超过0.25的也就是四分之一,爆破法不难想到
一、爆破法,直接循环记数,直到大于length * 0.25,执行结果如下:
25 / 25 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 38.6 MB
提交时间:4 天前
public static int findSpecialIntegerMy(int[] arr) {
int thisNum = 0;
int count = 0;
// 右移两位 = 除以4 = 0.25
// 这里考虑到有可能出现小数位所以向上取整
int needCount = (int) Math.ceil(arr.length >> 2);
for (int i : arr) {
if (i == thisNum) {
count++;
} else {
thisNum = i;
count = 1;
}
if (count > needCount) {
return thisNum;
}
}
return -1;
}
二、评论区大佬的做法类似
这道题两者都差不多没什么好说的,执行结果如下:
25 / 25 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 38.8 MB
提交时间:4 天前
double count = arr.length * 0.25;
int targetNum = Integer.MIN_VALUE;
int targetCount = 0;
for (int i = 0; i < arr.length; i++) {
if(arr[i] != targetNum) {
targetNum = arr[i];
targetCount = 1;
}else {
targetCount++;
}
if(targetCount > count) {
return targetNum;
}
}
return targetNum;
}
总的来说执行结果类似,但是不解的是为什么评论区大佬的方法会多0.2,而且其实只用到了几个变量内存就用到了30+,总感觉不知道什么时候开始默认的内存占用就要比30+高,而达不到以前的低,所以现在很多的算法内存占用都超越50%左右或者更低。