# 第一周演算法複習(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)先要比較a,b的大小,如果aif (t) c.push_back(t);
return c;
}
vector sub(vectora,vectorb)大數乘小數}
vector mul(vectora,int b)前面幾種運算都是從低位進行運算,直到高位,而除法顯然是從高位開始運算的,所以運算出的vector需要倒序while(t)
}
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...