代码随想录刷题记录 5 - 排序(5)

5 - 排序(5)

这是第五篇了,打算明天换一个类型的。今天看了一个知乎答案,男主喜欢跑步,他的妻子虽然无法与他同步,但非常支持,我觉得我应该也培养一个切实可行的小爱好。曾经看了那么多书,想了那么多的想法,是时候尝试去向外界表达输出了。所以先从写一些知乎简单的回答开始吧。

561. 数组拆分

题目大意:给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。返回该最大总和 。

解题思路:该题比较简单,由题意可知,使得总和最大即使每一个组合中交大的数较小,因为每一个组合中较大的数会被抵消,所以排序后依次选择最小的两个数组成组合即可。

代码:

int arrayPairSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int sum = 0;
        for(int i = 0;i < nums.size();i = i + 2){
            sum += nums[i];
        }
        return sum;
    }

594. 最长和谐子序列

题目大意:和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。

解题思路:通过打表的方式。用unordered_map记录每个元素和其出现的次数,然后遍历该表,依次比较前后两个元素出现次数的和。

代码:

int findLHS(vector<int>& nums) {
        unordered_map<int,int>m;
        int ans = 0;
        for(auto i : nums){
            m[i]++;
        }
        for(auto [key,val] : m){
            if(m.count(key+1)){
                ans = max( ans , val + m[key+1] );
            }
        }
        return ans;
    }

628. 三个数的最大乘积

题目大意:给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

解题思路:分为两大类情况。第一类为存在正数,那么最大值只能为一个最大的正数和两个最小的负数的乘积或者三个最大正数的乘积,比较哪一个比较大即可。第二类为不存在整数,那么最大值为三个最大负数的乘积。

代码:

int maximumProduct(vector<int>& nums) {
        int n=nums.size();
        int a = -1001, b = -1001, c = -1001;
        int d = 0, e = 0, f=0;
        for(int i = 0; i < n; i++){
            if(nums[i] > a){
                c = b;
                b = a;
                a = nums[i];
            }
            else if( nums[i] > b){
                c = b;
                b = nums[i];
            }
            else if( nums[i] > c){
                c = nums[i];
            }
            if(nums[i] < e){
                f = d;
                d = e;
                e = nums[i];
            }
            else if( nums[i] < d){
                f = d;
                d = nums[i];
            }
            else if( nums[i] < f){
                f = nums[i];
            }

        }
            if((b*c > d*e)||a<0)
                return a*b*c;
            else
                return a*d*e;
    }

645. 错误的集合

题目大意:集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组 nums 代表了集合 S 发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

解题思路:首先注意这个给的数组是无序的。1-n中有一个数字重复,有一个数字缺失,所以需要遍历两次。第一次遍历新建一个数组记录元素,找出并记录重复的元素。第二次遍历找到缺失元素并记录。

代码:

vector<int> findErrorNums(vector<int>& nums) {
        int n=nums.size();
        vector<int>ans(2);
        vector<int>m(n);
        for(auto i : nums){
            if(m[i-1] == 0)
                m[i-1] = 1;
            else
                ans[0] = i;
        }
        for(int i = 0; i < n; i++){
            if(m[i] == 0){
                ans[1] = i + 1;
                break;
            }
        }
        return ans;
    }

747. 至少是其他数字两倍的最大数

题目大意:给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。

解题思路:线性时间复杂度的办法为,遍历一次找出数组中最大值和第二大值,并记录最大值下标。若最大值大于等于第二大值的两倍,则符合题意。

代码:

int dominantIndex(vector<int>& nums) {
        int n = nums.size();
        int a = 0,b = 0,ans;
        if(n < 2)
            return 0;
        for(int i = 0; i < n; i++){
            if(nums[i] > a){
                b = a;
                a = nums[i];
                ans = i;
            }
            else if(nums[i] < a&&nums[i] > b){
                b = nums[i];
            }
        }
        if(a < b*2)
            return -1;
        return ans;
        
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值