按身高排序&&按位与最大的最长子数组

119 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

[6188. 按身高排序]

leetcode.cn/problems/so…

image-20220925142924165


做法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. 按位与最大的最长子数组]

leetcode.cn/problems/lo…

image-20220925144602840


题目首先要求子数组按位与结果最大,然后求最长子数组,

根据与运算的性质: 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;
    }
};