速来围观!leetcode java实现汇总
生活随笔
收集整理的這篇文章主要介紹了
速来围观!leetcode java实现汇总
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 前言
- 一、排序
- 1.1 選擇排序
- 1.2 冒泡排序
- 1.3 插入排序
- 1.4 歸并排序
- 1.5 快速排序
- 二、查找
- 2.1 二分查找(有序數(shù)組找某個(gè)數(shù)是否存在)
- 三、尋找最大數(shù)字
- 四、兩數(shù)之和
前言
目前是算法橫行的時(shí)代,邏輯很重要,特出此文章做一個(gè)總結(jié)會(huì)持續(xù)更新
一、排序
swap異或算法用的前提是交換的數(shù)組的元素a和b分別在不同的內(nèi)存里。如果在數(shù)組中想進(jìn)行交換,一定要保證i和j不能相等。
1.1 選擇排序
將第循環(huán)里的第一個(gè)元素和后面的比,誰(shuí)小把誰(shuí)放到前面,時(shí)間復(fù)雜度為n的平方
class SelectionSort(int[] arr){public void selectionSort(int[] arr){//排除雜條件if(arr == null || arr.length < 2){return;}for (int i = 0; i < arr.length; i++){//外層循環(huán)的每一個(gè)i先設(shè)置為此循環(huán)的最小值的索引,給到內(nèi)層循環(huán)進(jìn)行比較minIndex = i;for (int j = i+1; j<arr.length;j++){minIndex = arr[j] < arr[minIndex] ? j : minIndex;}//每次一個(gè)大循環(huán)找到一個(gè)該輪最小值放到第一個(gè)swap(arr,i,minIndex)}}public void swap(int[] arr;int i;int minIndex){int tmp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = tmp;} }1.2 冒泡排序
選擇排序是將最小的放到第一位,而冒泡排序是將最大的放到最后一位,并且每次都是相鄰兩個(gè)在比。
class Solution {public int[] sortArray(int[] nums) { bubbleSort(nums); return nums;}public void bubbleSort(int[] arr){if(arr == null || arr.length < 2){return;}for(int i = 0;i<arr.length;i++){for(int j=0;j<arr.length-1-i;j++){if(arr[j]>arr[j+1]){swap(arr,j,j+1);}}}}public void swap(int[] arr,int i,int j){//異或還可以理解為無(wú)進(jìn)位相加,下面方法的使用前提是arr[i]指向的內(nèi)存和arr[j]指向的內(nèi)存是兩塊不同的內(nèi)存,因?yàn)橥瑯拥膬?nèi)存異或會(huì)成為0int tmp = arr[i] ;arr[i] = arr[j];arr[j] = tmp;}}1.3 插入排序
按照算法可能情況的最差估計(jì)時(shí)間復(fù)雜度為n的平方,每次循環(huán)都保證0-n的地方是有序排序的,而且每次都是先跟前一位比,不行了才會(huì)進(jìn)行互換,否則不互換,這樣他最好的實(shí)現(xiàn)狀況是時(shí)間復(fù)雜度為n。
class InsertionSort(){public insertSort(int[] arr){//排除雜條件if(arr == null || arr.length < 2){return;}//i從1開(kāi)始是因?yàn)?-0上已經(jīng)實(shí)現(xiàn)了排序for (int i = 1; i < arr.length; i++){//0到i做到有序,此時(shí)已經(jīng)做到了0~i-1上的數(shù)有序,所以現(xiàn)在比較i-1(j)和第i位置的數(shù)的大小,換到不比左邊位置的數(shù)小了就停止for(int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--){swap(arr, j, j + 1);}}}public void swap(int[] arr,int i,int j){//異或還可以理解為無(wú)進(jìn)位相加,下面方法的使用前提是arr[i]指向的內(nèi)存和arr[j]指向的內(nèi)存是兩塊不同的內(nèi)存,因?yàn)橥瑯拥膬?nèi)存異或會(huì)成為0arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];} }1.4 歸并排序
左邊排好序右邊也排好序,復(fù)雜度為N*logN
public class MergeSort{public static void process(int[] arr, int L,int R){if(L==R){return;}int mid = L+((R-L)>>1);//先兩邊有序,后歸并mergeprocess(arr,L,mid);process(arr,mid,R);merge(arr,L,mid,R);}public static void merge(int[] arr,int L,int M,int R){//新設(shè)置一個(gè)數(shù)組放比較值int[] help = new int[R-L+1];int i = 0;int p1 = L;int p2 = M + 1;// 哪個(gè)小放哪個(gè),并移動(dòng)相應(yīng)的指針while (p1 <= M && p2 <= R){help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]}//下面兩個(gè)循環(huán)只會(huì)走一個(gè)while (p1<=M){help[i++] = arr[p1++];}while (p2<=R){help[i++] = arr[p2++];}for(i = 0,i < help.length;i++){//拷貝回原來(lái)數(shù)組arr[L+i] = help[i]}} }1.5 快速排序
class Solution {public void swap(int[] nums,int L,int R){int tmp = nums[L];nums[L] = nums[R];nums[R] = tmp;}public int[] sortArray(int[] nums) {int L = 0,R = nums.length-1;quickSort(nums,L,R);return nums;}public void quickSort(int[] nums,int L,int R){if(L<R){//遞歸終止條件swap(nums,L+(int)(Math.random()*(R-L+1)),R);//找隨機(jī)一個(gè)數(shù)字和最后一個(gè)元素互換,記住加一int[] middleIndex = partiton(nums,L,R);//進(jìn)行分區(qū),返回的是等于區(qū)的左索引坐標(biāo)和右索引indexquickSort(nums,L,middleIndex[0]-1);//減一是因?yàn)樾∮趨^(qū)的最右邊界處是等于區(qū)最左邊界減一quickSort(nums,middleIndex[1]+1,R);//加一是因?yàn)榇笥趨^(qū)最左邊界是等于區(qū)最右邊界加一}}public int[] partiton(int[] nums,int L,int R){//L相當(dāng)于此時(shí)的第三個(gè)指針int less = L-1;//減一是因?yàn)樾∮趨^(qū)的起始索引還沒(méi)有比較,所以先將小于區(qū)的指針指向第一個(gè)索引的前面一個(gè),不能改成L+1,這樣就默認(rèn)第一個(gè)數(shù)字確實(shí)比被比較的數(shù)字小了,萬(wàn)一沒(méi)有一個(gè)就會(huì)出錯(cuò)int more = R;//這里R不減一是因?yàn)樽詈笠粋€(gè)是被比較數(shù)字,所以開(kāi)始的大于區(qū)的指針是在他前面的while(L<more){if(nums[L]<nums[R]){//L代表現(xiàn)在這一段的比較數(shù)字的指針swap(nums,++less,L++);}else if(nums[L]>nums[R]){ swap(nums,--more,L);//指針不前移,因?yàn)榇藭r(shí)大于區(qū)的左邊界換過(guò)來(lái)的數(shù)據(jù)還沒(méi)有進(jìn)行比較}else{L++;}} swap(nums,more,R);return new int[]{less+1,more};//返回的more沒(méi)有加1是因?yàn)樽詈筮M(jìn)行了交換,也就是上一行代碼,此時(shí)more指向的是等于區(qū)的最后一個(gè)元素,把最后一個(gè)元素交換過(guò)來(lái)的就是被比較數(shù)字} }二、查找
2.1 二分查找(有序數(shù)組找某個(gè)數(shù)是否存在)
時(shí)間復(fù)雜度為log2N
三、尋找最大數(shù)字
尋找某一個(gè)數(shù)組里的某一段區(qū)間的最大值
public class GetMax{public static int process(int[] arr, int L,int R){if(L==R){return arr[L]; }int mid = ((R-L)>>1);//尋找到中點(diǎn)//遞歸調(diào)用int leftMax = process(arr,L,mid);int rightMax = process(arr,mid+1,R);return Math.max(leftMax,rightMax);} }四、兩數(shù)之和
class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<>();for(int i = 0; i < nums.length; i++) {if(map.containsKey(target - nums[i])) {return new int[] {map.get(target-nums[i]),i};}map.put(nums[i], i);}throw new IllegalArgumentException("No two sum solution");} }總結(jié)
以上是生活随笔為你收集整理的速来围观!leetcode java实现汇总的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: npm run dev 和 npx we
- 下一篇: 将数据传入重定向网页