第一周演算法複習

2022-09-10 09:12:11 字數 2648 閱讀 5770

# 第一周演算法複習(2021/11/08-2021/11/14)

雖然在c++中有內建的sort函式幫助我們進行時間複雜度為nlogn的快速排序,不過快排的思想和雙指標演算法還是很值得我們學習的

快排的思想:

很顯然,快排的關鍵就在於我們怎麼以分界點為界,移動值到分界點的兩邊。

開另外兩個陣列a,b,把所有小於等於分界點的數都輸入到a中,大於等於分界點的數都輸入到b中,然後再賦值給q,這樣雖然要多掃瞄一遍q和額外開了兩個陣列,不過無傷大雅

利用雙指標演算法能夠進行優雅地處理,首先將兩個指標放在q的最左端和最右端,因為每次都要先移動指標再判斷情況,當左側指標遇到乙個不小於分界點的數那麼就停止,當右側指標遇到乙個不大於分界點的數,也停止,兩個指標都停止之後,交換值繼續往前走

板子:

void quick_sort(int q,int l,int r)

quick_sort(q,l,j);

quick_sort(q,j+1,r);

}

用法:

const int n=1e6+10;

int q[n];

sort(q,q+n);

//將整個q陣列按從小到大排列

歸併的思想:

板子:

void merge_sort(int q,int l,int r)

當有很多數需要讀入的時候,最好使用scanf而不是cin

scanf的速度比cin快十幾倍甚至幾十倍

如果是string型別,那麼只能通過cin讀入

二分查詢也稱折半查詢,它是一種效率較高的查詢方式,但是二分查詢要求線性表是採用順序結構的。一般是乙個有單調性的陣列,但也不是絕對的。一般來說,有單調性的題目一定可以使用二分,沒有單調性的題目也可能可以使用二分。

思想:乙個有單調性的題目如果要滿足某個條件,那麼這個邊界肯定是可以被二分出來的。

舉乙個簡單的栗子:如果乙個公升序的線性表,我們要找到某個數的左邊界,if(q[mid]>=x) 滿足這個條件,且我們要找到的時候左邊界,那麼就把r=mid l=mid+1,直至找到。

bool check(int x)  

​int bsearch_1(int l,int r)

return l;}​

int bsearch_2(int l,int r)

return l;

}

bool check(double x)

double bsearch_3(double l,double r)

return l;

}

在處理浮點數的時候,我們通常計算到題目要求的精度的後兩位,比如題目要求的答案是六位小數,那麼我們計算的時候通常用的是八位小數。

兩個大數或者乙個大數和乙個小數的運算

大數是指幾千位長度的數字,這種數明顯是爆了longlong的,所以我們輸入的時候應該使用string型別,儲存的時候用vector

vector add(vector&a,vector&b)

if (t) c.push_back(t);

return c;

}

先要比較a,b的大小,如果a

vector sub(vectora,vectorb)

}

大數乘小數

vector mul(vectora,int b)

while(t)

}

前面幾種運算都是從低位進行運算,直到高位,而除法顯然是從高位開始運算的,所以運算出的vector需要倒序

vectordiv(vectora,int b,int &c)

reverse(c.begin(),c.end());

}

int func(int &a);

int main() //直接對a進行修改,而不是對a的副本進行修改

//引用傳遞和值傳遞的區別:

引用傳遞是直接對傳入的變數或者陣列等容器進行修改的,傳遞的過程中並不會拷貝乙個副本,這樣當我們傳長度為幾十萬的陣列或者更大的資料。就不會浪費空間。

定義:長度可變的陣列

常用操作:

vector *** ;  //定義乙個vector  typename可以是簡單的int 型別  也可以是陣列之類的容器

幾個常用的內建函式

vector.begin() //返回vector頭位址

vector.end() //返回vector尾位址的後面一位

因為美國人的思維大多是左閉右開

vector.push_back(***) //末尾加入元素

vector.pop_back(***) //末尾刪除元素

vector.insert(vector.begin()+3,***) //下表為3位置插入元素

vector.earse(vector.begin()+3) //下表為3位置刪除元素

vector.size() //vector長度

vector.clear() //清除所有元素

//訪問vector元素有兩種方法

1.下標訪問

vi[0] //和array乙個用法

2.迭代器

for(vector::iterator it=vi.begin();it!=vi.end();it++)

第一周複習

dialog分為五種 普通dialog 進度條dialog 時間dialog 日期dialog 自定義dialog menu 在android studio專案中想要新增menu布局檔案,無法直接建立,必須先建立乙個menu資料夾 選項選單 options menu 彈出選單 popmenu 上下文...

演算法,第一周

題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1...

Coursera演算法第一周

現在是第三週,剛把第一周做完,要抓緊了。首先是merge sort演算法,採用二分然後遞迴的方法,將時間優化到o nlog n def sort split a,b l a len a l b len b l l a l b l i 0 j 0 for k in range l if i l a a...