这次一道题没写,哎,家里还是太吵了,没有办法静下心来!
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;
}
};
反思与改进
- 对于容器属性的不熟悉,迭代器自己就带有遍历的功能。
记住:set,map自带排序属性,只要在定义的时候,定义好比较函数就可以,直接使用迭代器来实现排序。
参考链接:c++容器 set 自定义排序
set基本特点
C++ STL中Map的按Key排序和按Value排序 - 如何得到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
- 对容器使用迭代器来排序时,判断位置
使用其他变量来判断,是否越界。
- 对于map可以考虑使用数组,或者**pair<int,int>**来代替。更为简洁吧!