y总永远的神,学算法就来ACwing! ACwing
以下笔记内容均出自考研算法辅导课
数据结构(考研算法辅导课)
Days1 时间复杂度、矩阵展开;排序、进位制
第一讲 时间复杂度、矩阵展开
一、时间、空间复杂度
只考虑次数,不考虑常数。常见复杂度有:O(1)、O(n)、O(sqrt(n))、O(n^k)、O(logn)、O(nlogn)
考题:2011-1、2012-1、2013-1、2014-1、2017-1、2019-1
二、矩阵展开
矩阵的按行展开、按列展开,展开后下标从0开始。
考题:2016-4、2018-3、2020-1
上机试题
稳定排序:归并排序 stable_sort();
不稳定排序:快速排序、 堆排序、 sort();
//stable_sort() 写法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
struct Stu
{
string name;
int score;
bool operator< (const Stu& t) const //重载运算符
{
return score < t.score;
}
bool operator> (const Stu& t) const
{
return score > t.score;
}
}s[N];
int main()
{
int n, op;
cin >> n >> op;
for (int i = 0; i < n; i ++ ) cin >> s[i].name >> s[i].score;
if(!op) stable_sort(s, s + n, greater<Stu>()); //归并排序 从大到小
else stable_sort(s, s + n);
for (int i = 0; i < n; i ++ ) cout << s[i].name << " " << s[i].score << endl;
return 0;
}
// sort() 写法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
struct Stu
{
string name;
int score;
int id;
bool operator< (const Stu& t) const
{
if (score != t.score) return score < t.score;
return id < t.id;
}
bool operator> (const Stu& t) const
{
if (score != t.score) return score > t.score;
return id < t.id;
}
}s[N];
int main()
{
int n, op;
cin >> n >> op;
for (int i = 0; i < n; i ++ ) cin >> s[i].name >> s[i].score, s[i].id = i;
if(!op) sort(s, s + n, greater<Stu>());
else sort(s, s + n);
for (int i = 0; i < n; i ++ ) cout << s[i].name << " " << s[i].score << endl;
return 0;
}
进制转换
秦九韶算法 —— 其他进制转十进制
(an-1 an-2 … a2 a1) k = ( (an-1 * k + an-2) * k + an-3…
十进制转其他进制 —— 短除法
其他进制转其他进制 —— 短除法
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int a, b;
string s;
cin >> a >> b >> s;
vector<int> A;
for (int i = 0; i < s.size(); i ++ )
{
char c = s[s.size() - i - 1];
if (c >= 'A') A.push_back(c - 'A' + 10);
else A.push_back(c - '0');
}
string res;
if (s == "0") res = "0";
else
{
while (A.size())
{
int r = 0;
for (int i = A.size() - 1; i >= 0; i -- )
{
A[i] += r * a;
r = A[i] % b;
A[i] = A[i] / b;
}
while(A.size() && A.back() == 0) A.pop_back();
if (r < 10) res += to_string(r);
else res += r - 10 + 'a';
}
reverse(res.begin(), res.end());
}
cout << res << endl;
return 0;
}