本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
747.至少是其他数字两倍的最大数
题目大意
给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。
请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。
样例
数据规模
思路
先遍历找到最大的数字,然后再次遍历,因为最大数是唯一的,所以遍历到非最大数的时候,判断它的两倍是否小于等于最大数,如果不是就返回-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 对数字
题目大意
给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。
定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。
请找到和最小的 k 个数对 (u1,v1), (u2,v2) ... (uk,vk) 。
样例
数据规模
思路
看到数据中,那么可以直接采取的做法:要选择前对最小的数对,那就让中的前个和中的前个组合,塞进优先队列,选取和最小的前k对数对即可。时间复杂度
代码
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;
}
};