240717.LeetCode——2974.最小数字游戏

题目描述

你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice 和 Bob 决定玩一个游戏,游戏中每一轮 Alice 和 Bob 都会各自执行一次操作。游戏规则如下:

每一轮,Alice 先从 nums 中移除一个 最小 元素,然后 Bob 执行同样的操作。
接着,Bob 会将移除的元素添加到数组 arr 中,然后 Alice 也执行同样的操作。
游戏持续进行,直到 nums 变为空。
返回结果数组 arr 。

EX1.

在这里插入图片描述

EX2.

在这里插入图片描述

提示

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100
  • nums.length % 2 == 0

代码实现

C语言

暴力解法

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* numberGame(int* nums, int numsSize, int* returnSize)
{
    int i, j;//定义循环变量
    int t;//临时交换变量
    for (i = 0; i < numsSize - 1; i++)
    {
        for (j = 0; j < numsSize - i - 1; j++)
        {
            if (nums[j] > nums[j + 1])
            {
                t = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = t;
            }
        }
    }//进行冒泡排序:对原数组进行从小到大顺序排列
    for (i = 0; i < numsSize - 1; i = i + 2)
    {
        t = nums[i];
        nums[i] = nums[i + 1];
        nums[i + 1] = t;
    }//从数组首元素开始进行两两交换
    *returnSize = numsSize;//注意要返回输出数组的大小
    return nums;//返回输出数组
}
执行结果

在这里插入图片描述

代码思路

根据题目要求,每次取出两个最小的,放入输出数组,但是顺序不规则。所以不妨将其拆分成两次。先进行规则排序再进行两两交换。所以第一个冒泡排序(很久没有用到,所以模板有些生疏),第二个循环,变量隔了一项进行。

暴力解法优化

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 
 /*
自定义比较函数:用于比较两个元素。比较函数应当返回一个整数,表示比较结果:
小于零:表示第一个元素小于第二个元素。
等于零:表示两个元素相等。
大于零:表示第一个元素大于第二个元素。
*/
int compare(const void* a, const void* b)
{
    return (*(int*)a - *(int*)b);
}

int* numberGame(int* nums, int numsSize, int* returnSize)
{
    int i, j;
    int t;
    qsort(nums, numsSize, sizeof(int), compare);//C库函数,<stdlib.h>中
    for (i = 0; i < numsSize - 1; i = i + 2)
    {
        t = nums[i];
        nums[i] = nums[i + 1];
        nums[i + 1] = t;
    }
    *returnSize = numsSize;
    return nums;
}
执行结果

在这里插入图片描述

代码思路

对暴力解法进行优化,将冒泡函数进行封装,使用的是C库自带的函数,但需要自己定义一个比较函数,方法减少了空间复杂度。
其中

qsort()函数

声明
void qsort(void *base, size_t nitems, size_t size, int (*compare)(const void *, const void *));
参数

  • base: 指向待排序数组的第一个元素的指针。
  • nitems: 数组中的元素数量。
  • size: 数组中每个元素的大小(以字节为单位)。
  • compare: 比较函数的指针,该函数用于比较两个元素。比较函数应当返回一个整数,表示比较结果。

总结

昨天又没空刷力扣,今天也是终于把江科大51单片机刷完了,也是正式开始学习数据结构与算法了,开始跟夏令营的课程,刷题,今天学的是算法入门和时空复杂度,也学了怎么用MarkDown写文档,现在这篇文档就是用MarkDown编辑器写的,刚好今天周三也是算法日,写到这里已经23.15了哈哈哈哈哈哈哈哈哈哈哈哈,然后的话,就这样吧,保持我的暑期规划不会被破坏,嘿嘿,加油。
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值