Weekly Contest 174

这次一道题没写,哎,家里还是太吵了,没有办法静下心来!

1341. The K Weakest Rows in a Matrix

题目

输入一个矩阵,按每行的和,从小到大排序,找出前k个最小的行。
题目并不是很难,但是自己对一些函数不是很熟悉,导致没有写出来。

自己的思路

先使用accumulate(),对每一行求和。然后使用unordered_map对index对应一个值,这样可以对值排序,获得对应的index。

优秀代码
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
    set<pair<int, int>> m;
    for (auto i = 0; i < mat.size(); ++i) {
        auto p = accumulate(begin(mat[i]), end(mat[i]), 0);
        m.insert({p, i});
    }
    vector<int> res;
    for (auto it = begin(m); k > 0; ++it, --k)
        res.push_back(it->second);
    return res;
}
自己改进的代码
class Solution {
public:
    vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
        vector<int> res;
        set<pair<int,int>> idx_s;
        for(int i=0;i<mat.size();++i){
            idx_s.insert({accumulate(mat[i].begin(),mat[i].end(),0),i});
        }
        for(auto it=idx_s.begin();it-idx_s.begin()<k;++it){
            res.push_back(it.second());
            
        }
        return res;        
    }
};

这里还有一点问题,见下面第3点!

class Solution {
public:
    vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
        vector<int> res;
        set<pair<int,int>> idx_s;
        for(int i=0;i<mat.size();++i){
            idx_s.insert({accumulate(mat[i].begin(),mat[i].end(),0),i});
        }
        for(auto it=idx_s.begin();k>0;++it,--k){
            res.push_back(it->second);
        }
        return res;        
    }
};
反思与改进
  1. 对于容器属性的不熟悉,迭代器自己就带有遍历的功能。
    cpp中set和map
    记住:set,map自带排序属性,只要在定义的时候,定义好比较函数就可以,直接使用迭代器来实现排序。
    参考链接:c++容器 set 自定义排序
    set基本特点
    C++ STL中Map的按Key排序和按Value排序
  2. 如何得到vector的前K个值,组成新的值
    方法1:
    在这里插入图片描述
    在这里插入图片描述
    结果:
    在这里插入图片描述
    方法2:使用算法库里面的copy函数
    在这里插入图片描述
    这里std::back_inserter是在b后面制造一个向后插入元素的迭代器
    因为cop函数只负责复制元素,不会开辟空间。
    还有一种的方法就是,在定义的时候,先明确b的大小,可以看连接里面的例子。
    在这里插入图片描述
    参考链接:
    std::vector<int> from_vector(10);
    std::iota(from_vector.begin(), from_vector.end(), 0);
 
    std::vector<int> to_vector;
    std::copy(from_vector.begin(), from_vector.end(),
              std::back_inserter(to_vector));
// 或可选地,
//  std::vector<int> to_vector(from_vector.size());
//  std::copy(from_vector.begin(), from_vector.end(), to_vector.begin());
// 任一方式都等价于
//  std::vector<int> to_vector = from_vector;

std::copy, std::copy_if
std::back_inserter

  1. 对容器使用迭代器来排序时,判断位置
    使用其他变量来判断,是否越界。
    在这里插入图片描述
  2. 对于map可以考虑使用数组,或者**pair<int,int>**来代替。更为简洁吧!
发布了46 篇原创文章 · 获赞 0 · 访问量 815

猜你喜欢

转载自blog.csdn.net/github_38148039/article/details/104150207