在一个给定的数组nums
中,总是存在一个最大元素 。
查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
如果是,则返回最大元素的索引,否则返回-1。
示例 1:
输入: nums = [3, 6, 1, 0]
输出: 1
解释: 6是最大的整数, 对于数组中的其他整数,
6大于数组中其他元素的两倍。6的索引是1, 所以我们返回1.
示例 2:
输入: nums = [1, 2, 3, 4]
输出: -1
解释: 4没有超过3的两倍大, 所以我们返回 -1.
提示:
nums
的长度范围在[1, 50]
.- 每个
nums[i]
的整数范围在[0, 100]
.
审题:
1、给定一个整数数组,数组长度为[1, 50],数组不为空,至少有一个元素,只有一个元素的情况需要特殊处理
2、数组每个元素值范围
[0, 100],数组元素均为非0整数
3、找到数组中的最大元素,判断最大元素值是否至少时其他元素值的2倍,即最大元素值>=其他元素值
4、如果存在满足题意的最大元素值,则返回最大元素的索引,否则返回-1
思路:
1、暴力:找到最大元素,逐个判断最大元素是否满足>=其他各个元素,如果满足返回最大元素索引,否则返回-1
2、对暴力破解方法进行优化,
(1)比较最大元素与其他各个元素的值可以优化
(2)只要存在第2大的元素满足最大元素值>= 2 * 第二大元素值,其他各个元素自然满足最大元素值>= 2* 元素值,否则不存在满足题意要求的最大值
(3)对数组进行排序,很容易就获取到最大值和第二大值元素
执行结果:
代码:
int Compare (const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
int dominantIndex(int* nums, int numsSize){
// 对只有一个元素的数组进行特殊处理
if (numsSize < 2) {
return 0;
}
// copy数组
int *arr = (int *)malloc(numsSize * sizeof(int));
int i;
for (i = 0; i < numsSize; i++) {
arr[i] = nums[i];
}
// 对数组元素进行从大到小排序
qsort(arr, numsSize, sizeof(int), Compare);
// 判断是否满足最大元素值>= 2 * 第二大元素值,如果不满足则返回-1
if (arr[0] < (arr[1] * 2)) {
return -1;
}
// 如果满足满足最大元素值>= 2 * 第二大元素值,在原数组中查找最大元素索引并返回
for (i = 0; i < numsSize; i++) {
if (nums[i] == arr[0]) {
return i;
}
}
return -1;
}