前言
这是六月集训的第三日,今日的训练内容是 排序
解题报告
1.力扣1464
原题链接
题目概述
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。
请你计算并返回该式的最大值。
解题思路
直接排序后返回就行了。
源码剖析
int cmp(const void*a,const void*b){
return *(int*)a-*(int*)b;
}
int maxProduct(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp);
return (nums[numsSize-2]-1)*(nums[numsSize-1]-1);
}
2.力扣1287
原题链接
题目概述
给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
请你找到并返回这个整数
解题思路
建立一个哈希表,然后找到出现次数超过总容量四分之一的元素就可以啦。
源码剖析
int findSpecialInteger(int* arr, int arrSize){
int hash[100001]={0};
int i;
for(i=0;i<arrSize;++i){
hash[arr[i]]++;
}
for(i=0;i<100001;++i){
if (hash[i]>(arrSize/4.0)) break;
}
return i;
}
3.力扣1636
原题链接
题目概述
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
请你返回排序后的数组。
解题思路
今日陪家长出门太累了,头疼 明天就补上。
源码剖析
4.力扣436
原题链接
题目概述
给你一个区间数组 intervals ,其中 intervals[i] = [starti, endi] ,且每个 starti 都 不同 。
区间 i 的 右侧区间 可以记作区间 j ,并满足 startj >= endi ,且 startj 最小化 。
返回一个由每个区间 i 的 右侧区间 在 intervals 中对应下标组成的数组。如果某个区间 i 不存在对应的 右侧区间 ,则下标 i 处的值设为 -1 。
解题思路
源码剖析