給我自己的關於演算法

2021-08-18 23:13:52 字數 1675 閱讀 4600

陣列的演算法

(1)二分查詢法

對於有序數列才能使用二分查詢法

public

intbinarysearch(int arr,int n,int target)

if(target>arr[mid])else

return -1;

}}

不斷的維護最初的意義限制

為了防止溢位,int mid=l+(r-l)/2

1.明確變數的含義2.迴圈不變數。要維護變數的含義。3.小資料量的除錯

move zero (leetcode 283):leetcode.com

//時間複雜度o(n)

//空間複雜度o(n),使用了輔助空間

public

void

movezero(int nums)

}for(int i=0;ifor(int i=temp.size;i0;

}}

優化

//時間複雜度o(n)

//空間複雜度o(1)

public

void

movezero(int nums)

}//將nums剩餘位置置0

for(int i=k;i0;

}}

繼續優化

public

void

movezero(int nums)else}}

}

計數排序,適用於元素個數有限的情況

public

void

sortcolor(int nums);

for(int i =0;iif(nums[i]>=0&&nums[i]<=2)

count[nums[i]]++;

//////

//////

//////

//////

//////

//////

//////

//對於乙個前閉後閉的待運算區間,最好設定起始值為-1

int zero =-1;//nums[0...zero]==0

int two = nums.size();//nums[two...n-1]==2

for(int i=0;iif(nums[i]==1)

else

if(nums[i]==2)

else}}

}

給定乙個有序陣列和乙個整數target,在尋找兩個元素的索引,這兩個 元素的和為這個target,索引由1開始

1.最直接的思考當然是暴力解法,將陣列遍歷兩遍分別相加

2.但是從題幹上我們可以看出有乙個條件是陣列有序,首先就應當想到二分查詢法

for(int i=0;isize()-1;i++)

int l=0;

int r=nums.size()-1;

while(lif(nums[l]+nums[r]==target);

return res;

}else

if(nums[l]+nums[r]else(nums[l]+nums[r]>target)throw invalid_argument;

}

寫給我自己

現在是八月中旬,今天幾乎沒有做什麼事,回想起來,這幾個月貌似有點墮落,浪費了很多時間,明明應該有很多事情要做的 至少,我的ps,和cv應該準備了吧,如果是香港留學,那麼rp應該也要好好寫了吧。至少,報考了九月中旬的托福考試,應該好好準備考試了吧,雖然說去年考的比較失敗,但是不能因為這樣就沒自信呀 不...

48條給我自己的忠告

1 別怕丟人,追求丟人是一種成功的嘗試,至於為此笑話你的人,你可以把他們從你將來人生對手的名單中排除了,你也要為每一位上台唱歌的人鼓掌。2 你有足夠的理由佩服每天早起的人,不信的話,你去做。做到後會發現有很多人佩服你呢。3 nothing is impossible。只要選擇了目標,不要再想太遠,每...

關於KMP演算法的next陣列自己的理解

最近重溫了kmp演算法,順便記錄一下對kmp演算法的理解,比較難懂的應該算是next資料的使用了,先說說自己的理解 首先要理解next陣列的含義,假設有字串 假設有字串s和p,要在s中找到p,當比較p i 和s j 不相等時,如果是樸素演算法,p回溯到0,s回溯到開始匹配的下乙個位置 則i需要回溯到...