左神演算法筆記01

2021-10-11 18:36:55 字數 1961 閱讀 1457

對數器異或工具

一些其它的位運算子的操作

簡單理解為: 將乙個演算法的所有操作拆成基本操作(常數時間完成的操作)後,計算出操作次數和操作時間(可視為1)的乘積,即操作次數之和。在考慮最差情況時用o( )來表示時間複雜度,取最高項來表示。如o(n),o(logn)。

對n個數進行排列,則最差要進行1+2+3+……+n-1次交換操作和1+2+3+……n-1+n次檢視操作,累加即為n22

+n

2\frac 2 + \frac n 2

2n2​+2

n​,故時間複雜度為o(n

2n^2

n2)一種演算法的糾錯工具

用其它的保證正確的演算法做同一道題,可以不在意效率(如窮舉)。用隨機數生成大量資料,兩個演算法一起跑,有差別就用出現差別的資料進行人肉排查,當次數足夠多且無差異時,可以認為自己寫的演算法正確。

二進位制中,兩個數相同的位同為1或同為0時,將該位置為1,否則為0。

可用無進製的加法來理解。符號為:^

異或操作滿**換律和結合律,任意數 ^ 0= 本身

public

void

swap

(array[

],i,j)

//i和j不等,若相等會報錯

簡化一下,array[i]為a,array[j]為b

第一行執行後結果:

a = a ^ b

b = b

第二行執行後結果:

a = a ^ b

b = b ^ a ^ b = b ^ b ^ a = a

第三行執行後結果:

a = a ^ b ^ a = a ^ a ^ b = b

b = a

交換完成

int eor =0;

for(

int i : array)

//array為陣列

eor ^= i;

出現偶數次的數會兩兩抵消成為0,剩下的數異或0結果為其本身,即為出現次數為奇數的數。

首先我們要知道怎麼找乙個二進位制數最右邊的1的位置

public

intgetdiff

(int n)

//n為待找的數

int index;

//為n最右邊的1的位產生的數

index = n ^((

~n)+1)

;return index;

/***例:

*n : 00101001000

*~n : 11010110111

*~n+1 : 11010111000

*n ^((~n)+1): 00000001000

*/

我們對陣列做一遍同樣的操作,

int eor =0;

for(

int i : array)

//array為陣列

eor ^= i;

此時,我們得到了eor = a ^ b,假設a,b分別為要找的兩個數,那麼他們異或的結果起碼有一位為1,我們找到最右邊為1的位

int index =

getdiff

(eor)

;int a,b;

for(

int i : array)

再將陣列分為兩塊,進行異或操作結束就得到結果。

a = a <<1;

//a*2

a =(a <<1)

|1;//a*2+1

mid = left +

(right - left)

>>1;

//獲取左右的中點

左神演算法筆記03

可以是函式遞迴,也可以是迴圈實現。將大的陣列對半分為兩個陣列,每個陣列排好序後再合併為大的陣列。如果使用迴圈實現,要提防整形溢位 應用 最小和問題,若陣列的左邊的乙個數比右邊的某乙個數小,在返回結果加上自身的大小 public static intprocess int arr,int l,int ...

左神演算法整理筆記02

引例 利用查詢陣列最大值 思想步驟 public static void sortprocess int arr,int left,int right public static void merge int arr,int left,int mid,int right 當其中有乙個越界的時候 wh...

左神演算法整理筆記05

桶排序對應的很多都是困難題哦 例子 對0 60的陣列進行排序 例子 對應leetcode 164 給定乙個陣列,求如果排序之後,相鄰兩數的最大差值,要求時間複雜度0 n 且要求不能用非基於比較的排序 public intmaximumgap int nums if max min boolean h...