五月集训第三天:排序

五月刷题第三天详解

977. 有序数组的平方

977. 有序数组的平方

  • 将所有数求平方然后将求平方后得到的数组排序
int cmp(const void *a, const void *b){
    return *(int*)a - *(int*)b;
}

int* sortedSquares(int* nums, int numsSize, int* returnSize){
    int i;
    for(i = 0; i < numsSize; ++i){
        nums[i] = pow(nums[i], 2);
    }
    qsort(nums, numsSize, sizeof(int), cmp);
    *returnSize = numsSize;
    return nums;
}

268. 丢失的数字

268. 丢失的数字

  • 如果整个数组是完整的,那么整个数组是等差数列。由公式可以得到整个数组的值。
  • 遍历整个数组把在允许范围内的数求和
  • 最后,丢失的数字就是完整数组的和减去当前数组的和
int missingNumber(int* nums, int numsSize){
    int sum = 0;
    for(int i = 0; i < numsSize; i++){
        if(nums[i] >= 0 && nums[i] <= numsSize) sum += nums[i];
    }
    return numsSize*(numsSize+1)/2 - sum;
}

1877. 数组中最大数对和的最小值

1877. 数组中最大数对和的最小值

  • 首先排序,假设取第 i 个值,那么与当前值组成数对的值下标为 n-i-1 找到所有数对中的最大值即可。
#define MAX(a,b) a > b ? a : b;

int cmp(const void *a, const void *b){
    return *(int*)a - *(int*)b;
}


int minPairSum(int* nums, int numsSize){
    int i, n, ans, tmp;
    qsort(nums, numsSize, sizeof(int), cmp);
    n = numsSize / 2;
    ans = 0;
    for(i = 0; i < numsSize; ++i){
        tmp = nums[i] + nums[numsSize-1-i];
        ans = MAX(ans, tmp)
    }
    return ans;
}

950. 按递增顺序显示卡牌

950. 按递增顺序显示卡牌

  • 模拟题:这种题不能想算法,直接模拟。
  • 所谓模拟,就是照着题目的要求,将数组按需变更,然后最终的结果,就是你需要的。
  1. 首先对数组进行排序。
  2. 创建一个从 [0 :n-1]的数组用来模拟过程确定元素的具体位置。
  3. 然后对于数组模拟第一张拿走(存入一个下标数组),第二张放在最后。
  4. 重复执行第三步,直到整个数组模拟完毕。
  5. 按照下标数组将对应的卡牌安置好。
  • 说这么多也不如一个动图清晰:
    在这里插入图片描述
class Solution {
public:
    vector<int> deckRevealedIncreasing(vector<int>& deck) {
        sort(deck.begin(), deck.end());
        vector<int> ans, tmp, ret;
        int i, n = deck.size();
        int l = 0, r = n - 1;
        for(i = 0; i < n; ++i){
            tmp.push_back(i);
        }
        while(l <= r){
            ans.push_back( tmp[l] );
            ++l;
            if( l > r){
                break;
            }
            tmp.push_back( tmp[l] );
            ++l;
            ++r;
        }
        for(i = 0; i < n; ++i){
            ret.push_back(-1);
        }
        for(i = 0; i < n; ++i){
            ret[ ans[i] ] = deck[i];
        }
        return ret;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值