开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
[6188. 按身高排序]
做法1:使用哈希表
如果采用的是身高作为Key : 因为身高不相同,所以可以使用unordered_map
class Solution {
public:
struct Cmp
{
bool operator()(const pair<int,string>& left, const pair<int,string>& right)
{
return left.first > right.first;
}
};
vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
unordered_map<int,string> um;
for(int i = 0;i<names.size();i++)
um[heights[i]] = names[i];
//构造v容器
vector<pair<int,string>> v(um.begin(),um.end());
sort(v.begin(),v.end(),Cmp());//按升高排升序
vector<string> ans;
for(auto& kv:v)
ans.push_back(kv.second);
return ans;
}
};
如果采用的是名字作为Key : 因为名字可能相同,所以要使用
unordered_multimap
class Solution {
public:
struct Cmp
{
//按照身高降序排序
bool operator()(const pair<string,int>& left,const pair<string,int>& right)
{
return left.second > right.second;
}
};
unordered_multimap<string,int> um;
vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
for(int i = 0;i<names.size();i++)
um.insert(make_pair(names[i],heights[i]));
vector<pair<string,int>> v(um.begin(),um.end());
sort(v.begin(),v.end(),Cmp());//按身高排升序
vector<string> ans;
for(auto& kv:v)
ans.push_back(kv.first);
return ans;
}
};
做法2:直接使用vector
对原数组取相反数从小到大排序 相当于 对原数组从大到小排序
class Solution {
public:
vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
vector<pair<int,string>> v;
for(int i = 0;i<names.size();i++)
{
//注意:插入的是身高的相反数
v.push_back({-heights[i],names[i]});
}
//对原数组取相反数从小到大排序 相当于 对原数组从大到小排序
sort(v.begin(),v.end());//对身高的相反数升序排序
vector<string> ans;
for(auto& kv:v)
ans.push_back(kv.second);
return ans;
}
};
[6189. 按位与最大的最长子数组]
题目首先要求子数组按位与结果最大,然后求最长子数组,
根据与运算的性质: a&b <=min(a,b) 先找出整个数组中的最大值val,就可以知道最终结果的最大值是val, 要找到长度最大的子数组使得它&的结果是val. 因为是越&越小, 所以意味着子数组当中的所有值都必须是val
所以实际上求的是数组中的最大值val最多连续出现了几次 即:找数组中最大值val的最长连续序列的长度
class Solution {
public:
int longestSubarray(vector<int>& nums) {
int val = 0;//数组中的最大值,因为数组所有数都是>0的,所以可以先初始化为0
int ans = 0;
int len = 0;//记录最大值val最多连续出现了几次
for(int i = 0;i<nums.size();i++) val = max(val,nums[i]);
for(int i = 0;i<nums.size();i++)
{
if(nums[i] == val)
{
len++;
ans = max(ans,len);//更新答案
}
else
{
len = 0;
}
}
return ans;
}
};