747.至少是其他数字两倍的最大数 & 373.查找和最小的 K 对数字

214 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

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

题目大意

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。

请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1

样例

img

数据规模

img

思路

先遍历找到最大的数字,然后再次遍历,因为最大数是唯一的,所以遍历到非最大数的时候,判断它的两倍是否小于等于最大数,如果不是就返回-1。遍历结束还未返回-1,说明存在符合条件的最大数,返回最大数字的下标即可。

代码

class Solution {
public:
    int dominantIndex(vector<int>& nums) {
        int maxx=0,opt=0;
        for(int i=0;i<nums.size();i++){
            if(maxx<nums[i]){
                maxx=nums[i];
                opt=i;
            }
        }
        for(auto it:nums){
            if(it==maxx)continue;
            if(it*2>maxx)return -1;
        }
        return opt;
    }
};

题目

373.查找和最小的 K 对数字

题目大意

给定两个以 升序排列 的整数数组 nums1nums2 , 以及一个整数 k

定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2

请找到和最小的 k 个数对 (u1,v1), (u2,v2) ... (uk,vk)

样例

img

数据规模

img

思路

看到数据中k<=1000k<=1000,那么可以直接采取k2k^2的做法:要选择前kk对最小的数对,那就让nums1nums1中的前kk个和nums2nums2中的前kk个组合,塞进优先队列,选取和最小的前k对数对即可。时间复杂度O(k2logk)O(k^2logk)

代码

class Solution {
public:
    struct Node{
        int x,y;
        bool operator < (Node a)const{
            return a.x+a.y<x+y;
        }
    };
    vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
        priority_queue<Node>q;
        for(int i=0;i<min((int)nums1.size(),k);i++){
            for(int j=0;j<min((int)nums2.size(),k);j++){
                Node now;now.x=nums1[i];now.y=nums2[j];
                q.push(now);
            }
        }
        vector<vector<int>>a;
        for(int i=0;i<k&&q.size();i++){
            vector<int>b;
            Node now=q.top();q.pop();
            b.push_back(now.x);b.push_back(now.y);
            a.push_back(b);
        }
        return a;
    }
};