數據結構與算法入門題


排序

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無法到達終點,加滿油,能跑多遠跑多遠。

更清晰一些的貪心策略:

按照價格從低到高將加油站排序。從價格最低的加油站開始,加油使其能走盡量遠的距離(不覆蓋已走過的距離&&不超過終點的距離)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM