/**
* 给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
* 请你找到并返回这个整数
*
* 示例:
* 输入:arr = [1,2,2,6,6,6,6,7,10]
* 输出:6
*
* 提示:
* 1 <= arr.length <= 10^4
* 0 <= arr[i] <= 10^5
*
* 解题思路一:
* 1.创建一个长度为arr中最大值的数组,存储频次,找到目标数
*
* 解题思路二:
* 1.对象记频次,找到符合条件的数据,直接返回
*
* 解题思路三:
* 1.利用有序特性,逐个判断计数,找到符合条件的直接返回
*
* 解题思路四:
* 1.利用二分逐个计算每个元素频次,找到符合条件的直接返回
*
*
*/
/**
* @param {number[]} arr
* @return {number}
*/
var findSpecialInteger1 = function(arr) {
var n = arr.length,upper = Math.max(...arr);
var nums = new Array(upper+1).fill(0);
for(var i=0;i<n;i++){
nums[arr[i]]++;
}
for(var j=0;j<nums.length;j++){
if(nums[j]*4>n){
return j;
}
}
return -1;
};
var findSpecialInteger2 = function(arr) {
var obj = {},n = arr.length;
if(n==1) return arr[0];
for(var i=0;i<n;i++){
if(arr[i] in obj){
obj[arr[i]] ++;
if(obj[arr[i]]*4>n){
return arr[i];
}
}else{
obj[arr[i]] = 1;
}
}
return -1;
};
var findSpecialInteger3 = function(arr) {
var cur = arr[0],count=0,n = arr.length;
for(var i=0;i<n;i++){
if(arr[i] == cur){
++count;
if(count*4>n){
return cur;
}
}else{
cur = arr[i];
count = 1;
}
}
return -1;
};
var findSpecialInteger = function(arr) {
var n =arr.length,sec = Math.floor(n/4+1);
var r_index = findRIndex(arr,6);
var l_index = findLIndex(arr,6);
for (let i = 0; i < n; i+=sec) {
var r_index = findRIndex(arr,arr[i]);
var l_index = findLIndex(arr,arr[i]);
if(r_index - l_index>=sec){
return arr[i];
}
}
return -1;
};
function findRIndex(arr,target){
var left = 0,right = arr.length-1,mid;
while(left<=right){
mid = Math.floor((left+right)/2);
if(arr[mid]<=target){
left = mid+1;
}else{
right = mid-1;
}
}
return left;
}
function findLIndex(arr,target){
var left = 0,right = arr.length-1,mid;
while(left<=right){
mid = Math.floor((left+right)/2);
if(arr[mid]<target){
left = mid + 1;
}else{
right = mid-1;
}
}
return left;
}
var arr = [1,2,2,6,6,6,6,7,10];
console.log(findSpecialInteger(arr));
leetcode算法刷题记录之有序数组中出现次数超过25%的元素
最新推荐文章于 2024-04-04 11:47:16 发布