leetcode刷题记录(二、排序.2)

4.最大间距

给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。

class Solution {
public:
    int maximumGap(vector<int>& nums) {
        int n=nums.size();
        if(n<2) return 0;
        sort(nums.begin(),nums.end());
        int count=0;
        int tmp;
        for(int i=0;i<n-1;i++){
            tmp=nums[i+1]-nums[i];
            if(tmp>count){
                count=tmp;
            };
        };
        return count;

    }
};

5.多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        return nums[nums.size() / 2];
    }
};

//如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为n/2(向下取整)的元素(下标从 0 开始)一定是众数

法二:暴力循环

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(begin(nums),end(nums));
        int all=1,target=nums.size()/2;
        for(int i=0;i<nums.size()-1;i++){
            all++;
            if(nums[i]!=nums[i+1]) all=1;
            if(all>target) return nums[i];
        }
        return nums[0];
    }
};

6.最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

一种思路:输入数组有相同数字开头 ,例如 [4,42][4,42] 和 [4,45][4,45]。

对于 [4,42][4,42],比较 442 > 424442>424,需要把 44 放在前面;

对于 [4,45][4,45],比较 445 < 454445<454,需要把 4545 放在前面。

输入数组 没有相同数字开头,可以比较输入数组的每个元素的最高位,最高位相同的时候比较次高位,以此类推,完成排序,然后把它们拼接起来。

思路二:两个数拼起来,哪个大选哪个

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        auto cmp = [&](int a, int b) {
            auto sa = to_string(a);
            auto sb = to_string(b);
            return sa + sb > sb + sa;
        };

        sort(nums.begin(), nums.end(), cmp);
        
        string res;
        for (const auto& num : nums) {
            res += to_string(num);
        }

        auto pos = res.find_first_not_of('0');
        if (pos == string::npos) {
            return "0";
        }
        
        return res.substr(pos);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值