Weekly Contest 174

本文分享了一道关于C++编程的算法题解析,通过使用accumulate()函数和set容器,实现矩阵按行和排序的解决方案。文章对比了不同代码实现,强调了容器属性和迭代器在C++中的应用技巧。

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

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>**来代替。更为简洁吧!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值