LeetCode刷题记录--747. 至少是其他数字两倍的最大数

747. 至少是其他数字两倍的最大数

在一个给定的数组nums中,总是存在一个最大元素 。

查找数组中的最大元素是否至少是数组中每个其他数字的两倍。

如果是,则返回最大元素的索引,否则返回-1。

示例 1:

输入: nums = [3, 6, 1, 0]
输出: 1
解释: 6是最大的整数, 对于数组中的其他整数,
6大于数组中其他元素的两倍。6的索引是1, 所以我们返回1.

示例 2:

输入: nums = [1, 2, 3, 4]
输出: -1
解释: 4没有超过3的两倍大, 所以我们返回 -1.

提示:

  1. nums 的长度范围在[1, 50].
  2. 每个 nums[i] 的整数范围在 [0, 100].

审题:

1、给定一个整数数组,数组长度为[1, 50],数组不为空,至少有一个元素,只有一个元素的情况需要特殊处理

2、数组每个元素值范围 [0, 100],数组元素均为非0整数

3、找到数组中的最大元素,判断最大元素值是否至少时其他元素值的2倍,即最大元素值>=其他元素值

4、如果存在满足题意的最大元素值,则返回最大元素的索引,否则返回-1

思路:

1、暴力:找到最大元素,逐个判断最大元素是否满足>=其他各个元素,如果满足返回最大元素索引,否则返回-1

2、对暴力破解方法进行优化,

(1)比较最大元素与其他各个元素的值可以优化

(2)只要存在第2大的元素满足最大元素值>= 2 * 第二大元素值,其他各个元素自然满足最大元素值>= 2* 元素值,否则不存在满足题意要求的最大值

(3)对数组进行排序,很容易就获取到最大值和第二大值元素

执行结果:

LeetCode刷题记录--747. 至少是其他数字两倍的最大数_第1张图片

代码:

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;
}   

 

 

 

你可能感兴趣的:(Leetcode记录,leetcode,c语言,快速排序)