数据结构与算法入门题
Posted wenny-kiki
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法入门题相关的知识,希望对你有一定的参考价值。
排序
std::sort函数
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){ //重写比较规则,默认小于运算符定序
return a>b;
}
int main(){
int b[30];
sort(b,b+30,cmp);
return 0;
}
算符重载
struct stu{
int sno;
int grade;
bool operator < (const stu &b) const {
if(grade!=b.grade) return grade<b.grade;
else return sno<b.sno;
}
}buf[1000];
日期类问题
日期差值
题解1:计算两个日期相对于0000 00 00 的差值,然后差值相减+1
题解2:令日期不断+1,直到第一个日期等于第二个日期
题解3:预处理,使用三维数组,用年月日分别表示下标,是hash的基本思想
//判断闰年宏定义
#define ISYEAP(x) ((x%100!=0&&x%4==0)||(x%400==0)) ? 1:0
//预存每月天数
int dayTab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
//预处理每一天与原点日期的天数差
while(tmp.Year != 3001) {
buf[tmp.Year][tmp.Month][tmp.Day] = cnt;
tmp.nextDay();
cnt ++;
}
解决区间问题
把原区间问题统一到起点确定的区间问题上去
这样做还可以带来一个好处——预处理;可以在程序真正开始处理输入数据之前,预处理出所有数据;当数据真正开始输入时,只需要用O(1)的时间复杂度将保存的数据读出,稍加处理就能得到答案;预处理是空间换时间的重要手段
Hash应用
将存储位置与数据本身对应起来的存储手段就是hash
空间换时间,可以降低时间复杂度
题目中往往给出严格的区间
排版题
先完成排版,再进行输出
二维的问题可能需要三重循环
基本的查找
基本要素:
查找空间
:也常被称为解空间。所谓查找,就是在该查找空间中找寻符合 我们要求的解的过程。
查找目标
:我们需要一个目标来判断查找空间中的各个元素是否符合我们的要求,以便判断查找活动是否已经成功
查找方法
:即利用某种特定的策略在查找空间中查找各个元素。不同的策 略对查找的效率和结果有不同的影响,所以对于某个特定的问题,我们要选择切 实可行的策略来查找解空间
二分查找:
时间复杂度:O(logL)
重要应用:定界--确定边界点
贪心算法
思想:选择“当前最好的选择”,而不从整体上去把握
使用反证法来证明
经典问题:固定金钱最多能买到多少物品--每次买性价比最高的物品
收看节目中结束时间最早的节目,是我们要找的贪心策略
经典问题:fill or not to fill
描述:由于有高速公路,从杭州开车到任何其他城市都很方便。但由于汽车的油箱容量有限,不得不在途中找加油站加油。在不同的加油站,加油的价格可能不同。请设计最便宜的路线。
常规思路:
对于当前站点S,所能到达的最大范围即满油量所能到达的距离,设满油量能前进的距离为maxToGo,则在S到S+maxToGo范围内,分如下情况进行考虑:
Ⅰ此范围内有加油站
①有比当前站点便宜的加油站,因为只从最小的局部考虑问题,如果有多个比当前便宜的,到达那个最近的而不是最便宜的(只需要在找到第一个比S便宜的站点时break即可)。
②全部比S更贵(易错点)
2.1 如果从S无法到达终点,则选择最便宜的那个,从S加满油到达那个站点。
2.2 如果从S可以直接到达终点,则从S加油至能到达终点,直接开到终点。
Ⅱ此范围内无加油站
①如果从S可以直接到达终点,则加到能到达终点,直接到达。
②如果从S无法到达终点,加满油,能跑多远跑多远。
更清晰一些的贪心策略:
按照价格从低到高将加油站排序。从价格最低的加油站开始,加油使其能走尽量远的距离(不覆盖已走过的距离&&不超过终点的距离)。
以上是关于数据结构与算法入门题的主要内容,如果未能解决你的问题,请参考以下文章