陣列的演算法
(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需要回溯到...