[学习报告]《LeetCode零基础指南》(第五讲) 排序API


解题报告

排序数组

题目链接:912. 排序数组

题目描述

给你一个整数数组 nums,请你将该数组升序排列。

解题思路

使用qsort函数

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(const void *p1, const void *p2){
    return *(int *)p1 - *(int *)p2;
}

int* sortArray(int* nums, int numsSize, int* returnSize){
    qsort(nums, numsSize, sizeof(int), cmp);
    *returnSize = numsSize;
    return nums;
}

(贴通过的截图)

多数元素

题目链接:169. 多数元素

题目描述

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

解题思路

排序后,数量大于 n / 2 的元素一定出现在数组的中间位置。

int cmp(const void *p1, const void *p2){
    return *(int *)p1 - *(int *)p2;
}

int majorityElement(int* nums, int numsSize){
    qsort(nums, numsSize, sizeof(int), cmp);
    return nums[numsSize / 2];
}

(贴通过的截图)

存在重复元素

题目链接:217. 存在重复元素

题目描述

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

解题思路

排序后,重复的数一定是相邻的。

int cmp(const void *p1, const void *p2){
    return *(int *)p1 - *(int *)p2;
}

bool containsDuplicate(int* nums, int numsSize){
    qsort(nums, numsSize, sizeof(int), cmp);
    for(int i = 0; i < numsSize - 1; i ++ ){
        if(nums[i] == nums[i + 1])
            return true;
    }
    return false;
}

(贴通过的截图)

最大间距

题目链接:164. 最大间距

题目描述

给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。
您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法

解题思路

升序排序,计算所有相邻数字的差,找到最大值。

int cmp(const void *p1, const void *p2){
    return *(int *)p1 - *(int *)p2;
}
int maximumGap(int* nums, int numsSize){
    int max = 0;
    qsort(nums, numsSize, sizeof(int), cmp);
    for(int i = 1; i < numsSize; i ++ ){
        if(nums[i] - nums[i - 1] > max)
            max = nums[i] - nums[i - 1];
    }
    return max;
}

(贴通过的截图)

按奇偶排序数组

题目链接:905. 按奇偶排序数组

题目描述

给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。
返回满足此条件的 任一数组 作为答案。

解题思路

qsort函数按偶数在前,奇数在后排序

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int qua(int x){
    return x % 2;
}
int cmp(const void *p1, const void *p2){
    return qua(*(int *)p1) - qua(*(int *)p2);
}
int* sortArrayByParity(int* nums, int numsSize, int* returnSize){
    qsort(nums, numsSize, sizeof(int), cmp);
    *returnSize = numsSize;
    return nums;
}

(贴通过的截图)

最小时间差

题目链接:539. 最小时间差

题目描述

给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

解题思路

( 1 ) (1) (1) 将时间转换为分钟。
( 2 ) (2) (2) 字符串格式化对应的整数。
( 3 ) (3) (3) 分钟升序排序。
( 4 ) (4) (4) 获取相邻时间差的最小值。
( 5 ) (5) (5) 注意时间的循环。

int cmp(const void *p1, const void *p2){
    return *(int *)p1 - *(int *)p2;
}

int findMinDifference(char ** timePoints, int timePointsSize){
    int ans = 1440, h = 0, m = 0;
    int *ret = (int *)malloc(sizeof(int) * timePointsSize);
    for(int i = 0; i < timePointsSize; i ++ ){                         //(1)
        sscanf(timePoints[i],"%d:%d", &h, &m);                         //(2)  
        ret[i] = h * 60 + m;
    }

    qsort(ret, timePointsSize, sizeof(int), cmp);                      //(3)
    for(int i = 1; i < timePointsSize; i ++){
        ans = fmin(ans, ret[i] - ret[i - 1]);                          //(4)
    }
    return fmin(ans, ret[0] - ret[timePointsSize - 1] + 1440);         //(5)
}

(贴通过的截图)

三角形的最大周长

题目链接:976. 三角形的最大周长

题目描述

给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。

解题思路

数组降序排序,枚举判断是否满足 a + b > c。

int cmp(const void *p1, const void *p2){
    return *(int *)p2 - *(int *)p1;
}

int largestPerimeter(int* nums, int numsSize){
    qsort(nums, numsSize, sizeof(int), cmp);
    for(int i = 0; i < numsSize - 2; i ++ ){
        if(nums[i + 1] + nums[i + 2] > nums[i]){
            return nums[i] + nums[i + 1] + nums[i + 2];
        }
    }
    return 0;
}

(贴通过的截图)

救生艇

题目链接:881. 救生艇

题目描述

给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回 承载所有人所需的最小船数

解题思路

( 1 ) (1) (1)按升序排序。
( 2 ) (2) (2)双指针,l 指向最左端即最轻的人,r 指向最右端即最重的人。
( 3 ) (3) (3)两个指针指向同一个位置,说明只剩一个人,船 + 1并跳出循环。
( 4 ) (4) (4)最轻的人和最重的人的相加大于限制,只能重的人单独一条船,r 向右端移一位收缩区间。
( 5 ) (5) (5)最轻的人和最重的人的相加小于限制,两个人同一条船,同时 l 向右、r 向左移一位收缩区间。

int cmp(const void *p1, const void *p2){
    return *(int *)p1 - *(int *)p2;
}

int numRescueBoats(int* people, int peopleSize, int limit){
    int ans = 0;
    qsort(people, peopleSize, sizeof(int), cmp);             //(1)
    int l = 0, r = peopleSize - 1;                           //(2)
    while(l <= r){
        if(l == r){                                          //(3)
            ans ++ ;
            break;
        }
        else if(people[r] + people[l] > limit){				 //(4)
            ans ++ ;
            r -- ;
        }else{												 //(5)
            ans ++ ;
            l ++ ;
            r -- ;
        }
    }
    return ans;
}

(贴通过的截图)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值