• leetcode:1337. 方阵中战斗力最弱的 K 行


    1337. 方阵中战斗力最弱的 K 行

    给你一个大小为 m * n 的方阵 mat,方阵由若干军人和平民组成,分别用 0 和 1 表示。
    请你返回方阵中战斗力最弱的 k 行的索引,按从最弱到最强排序。
    如果第 i 行的军人数量少于第 j 行,或者两行军人数量相同但 i 小于 j,那么我们认为第 i 行的战斗力比第 j 行弱。
    军人 总是 排在一行中的靠前位置,也就是说 1 总是出现在 0 之前。

    示例 1:

    输入:mat = 
    [[1,1,0,0,0],
     [1,1,1,1,0],
     [1,0,0,0,0],
     [1,1,0,0,0],
     [1,1,1,1,1]], 
    k = 3
    输出:[2,0,3]

    解释:

    每行中的军人数目:
    行 0 -> 2 
    行 1 -> 4 
    行 2 -> 1 
    行 3 -> 2 
    行 4 -> 5 
    从最弱到最强对这些行排序后得到 [2,0,3,1,4]

    示例 2:

    输入:mat = 
    [[1,0,0,0],
     [1,1,1,1],
     [1,0,0,0],
     [1,0,0,0]], 
    k = 2
    输出:[0,2]

    解释: 

    每行中的军人数目:
    行 0 -> 1 
    行 1 -> 4 
    行 2 -> 1 
    行 3 -> 1 
    从最弱到最强对这些行排序后得到 [0,2,3,1]

    提示:

    m == mat.length
    n == mat[i].length
    2 <= n, m <= 100
    1 <= k <= m
    matrix[i][j] 不是 0 就是 1

    法一:写cmp函数进行对结构体排序

    class Solution
    {
    public:
       typedef struct node
        {
            int val;
            int index;
        };
    
       static  bool cmp(Solution::node a,Solution::node b){
            return a.val==b.val?a.index<b.index:a.val<b.val;
        }
    
        vector<int> kWeakestRows(vector<vector<int>> &mat, int k)
        {
            int len=mat.size();
            node res[len];
            for (int i = 0; i < len; i++)
            {
                int cnt = 0;
                for (int j = 0; j < mat[0].size(); j++)
                {
                    if (mat[i][j])
                        cnt++;
                }
                res[i].index=i;
                res[i].val=cnt;
            }
    
            sort(res,res+len,cmp);
    
            vector<int>v;
            for(int i=0;i<k;i++){
                v.push_back(res[i].index);
            }
            
            return v;
        }
    };
    

     法二:重载运算符的方法,速度更快,快四毫秒。

    class Solution
    {
    public:
        struct node
        {
            int val;
            int index;
            bool operator<(const node &b){
                return val==b.val?index<b.index:val<b.val;
            }
        };
    
        vector<int> kWeakestRows(vector<vector<int>> &mat, int k)
        {
            int len=mat.size();
            node res[len];
            for (int i = 0; i < len; i++)
            {
                int cnt = 0;
                for (int j = 0; j < mat[0].size(); j++)
                {
                    if (mat[i][j])
                        cnt++;
                }
                res[i].index=i;
                res[i].val=cnt;
            }
    
            sort(res,res+len);
    
            vector<int>v;
            for(int i=0;i<k;i++){
                v.push_back(res[i].index);
            }
    
            return v;
        }
    };
    

      

  • 相关阅读:
    Java设计模式四: 原型模式(Prototype Pattern)
    Java设计模式六:观察者模式(Observer)
    Java设计模式九:状态模式(State)
    Windows 8 开发系列 自定义Gridview 绑定列表数据时出错
    Windows 8 开发系列如何修改系统样式
    Windows 8 开发系列全局资源App.xml的ContentFontsize会导致应用退出
    Windows 8 开发系列如何使状态栏不重复点击
    thinkpad E430 如何实现Fn键锁定或和功能键互换顺序
    Windows 8 开发系列应用挂起
    Windows 8 Metro 应用开发App Bar问题
  • 原文地址:https://www.cnblogs.com/52dxer/p/12540214.html
Copyright © 2020-2023  润新知