刷题 21-25

二十一、数组中两元素最大乘积

给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j使 (nums[i]-1)*(nums[j]-1) 取得最大值。

请你计算并返回该式的最大值。

示例 1:

输入:nums = [3,4,5,2]
输出:12 
解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)*(nums[2]-1) = (4-1)*(5-1) = 3*4 = 12 。 

示例 2:

输入:nums = [1,5,4,5]
输出:16
解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。

示例 3:

输入:nums = [3,7]
输出:12
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-1]-1)*(nums[numsSize-2]-1);
}
int maxProduct(int* nums, int numsSize) {
    int a = nums[0], b = nums[1];  // 使用数组的第一个和第二个元素初始化变量a和b
    if (a < b) {
        int c = a;  // 临时变量,用于存储a的值
        a = b;      // 将b的值赋给a
        b = c;      // 将c(初始的a)的值赋给b
    }
    for (int i = 2; i < numsSize; i++) {
        if (nums[i] > a) {
            b = a;          // 更新第二大的值(b)为之前的最大值(a)
            a = nums[i];    // 更新最大值(a)为当前元素
        } else if (nums[i] > b) {
            b = nums[i];    // 更新第二大的值(b)为当前元素
        }
    }
    return (a - 1) * (b - 1);  // 返回(a - 1)和(b - 1)的乘积
}

二十二、

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。

请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [1]
输出:0
解释:因为不存在其他数字,所以认为现有数字 1 至少是其他数字的两倍。
int m1 = -1, m2 = -1;  // 初始化最大值m1和次大值m2为-1
int index = -1;        // 初始化索引为-1
for (int i = 0; i < numsSize; i++) {
    if (nums[i] > m1) {
        m2 = m1;          // 更新次大值m2为之前的最大值m1
        m1 = nums[i];     // 更新最大值m1为当前元素
        index = i;        // 更新索引为当前元素的索引
    }
    else if (nums[i] > m2) {
        m2 = nums[i];     // 更新次大值m2为当前元素
    }
}
return m1 >= m2 * 2 ? index : -1;  // 如果最大值m1大于等于次大值m2的两倍,则返回最大值的索引,否则返回-1

 二十三、错误的集合

集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。

给定一个数组 nums 代表了集合 S 发生错误后的结果。

请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:

输入:nums = [1,2,2,4]
输出:[2,3]

示例 2:

输入:nums = [1,1]
输出:[1,2]
int* a = (int*)malloc(sizeof(int) * numsSize);  // 动态分配大小为numsSize的整型数组a
for (int i = 0; i < numsSize; i++) {
    a[i] = 0;  // 将数组a的所有元素初始化为0
}
for (int i = 0; i < numsSize; i++) {
    a[nums[i] - 1]++;  // 统计每个数出现的频次,并将频次记录在数组a中
}
int* res = (int*)malloc(sizeof(int) * 2);  // 动态分配大小为2的整型数组res
for (int i = 0; i < numsSize; i++) {
    if (a[i] == 2) {
        res[0] = i + 1;  // 找到频次为2的数,存储在res的第一个位置
    }
    if (a[i] == 0) {
        res[1] = i + 1;  // 找到频次为0的数,存储在res的第二个位置
    }
}
*returnSize = 2;  // 设置返回结果数组的大小为2
return res;  // 返回结果数组的地址

你可能感兴趣的:(算法,数据结构,leetcode)