1. 程式人生 > 其它 >力扣_陣列

力扣_陣列

刪除排序陣列中的重複項

//設定兩個指標,一個是快指標fast,一個是慢指標slow //fast的作用是掃描出第一個新的元素然後賦值給slow所指的位置 //最後slow所指的位置就是最後一個新元素,所指向的序號+1就是陣列中不重複數的個數 classSolution{ publicintremoveDuplicates(int[]nums){ //n代表nums陣列的長度 intn=nums.length; //設定快指標fast和慢指標slow intfast=1; //slow也是1的原因是為了後面序號不用再加1 intslow=1; while(fast<n){ if(nums[fast]!=nums[fast-1]){
nums[slow]=nums[fast]; slow++; } fast++; } returnslow; } }

買賣股票的最佳時機 II

//貪心演算法 //只要存在後一項元素大於前一項元素就將其加入總和中 classSolution{ publicintmaxProfit(int[]prices){ //陣列prices的長度 intn=prices.length; //返回最大值 intmax=0; for(inti=0;i<n-1;i++){ if((prices[i+1]-prices[i])>0){ max=max+(prices[i+1]-prices[i]); } } returnmax;
} }

旋轉陣列

//使用了三次的倒置 //第一次是全部倒置一次 //第二次是前k個元素倒置一次 //第三次是除前k個元素外剩下元素倒置一次
classSolution{ publicvoidrotate(int[]nums,intk){ //nums的長度 intn=nums.length; //有可能k大於陣列的本身長度,要用除餘n來調整!!! k=k%n; //第一次倒置 reverse(nums,0,n-1); //第二次倒置 reverse(nums,0,k-1); //第三次倒置 reverse(nums,k,n-1); } //倒置演算法 publicvoidreverse(int[]rev,intfront,intend){
while(front<end){ inttemp=rev[front]; rev[front]=rev[end]; rev[end]=temp; front++; end--; } } }

存在重複元素

//先排序 //然後逐步後移,判斷兩者是否相同,若相同則返回true classSolution{ publicbooleancontainsDuplicate(int[]nums){ //排序演算法Arrays.sort() Arrays.sort(nums); //nums的長度 intn=nums.length; for(inti=0;i<n-1;i++){ if(nums[i]==nums[i+1]){ returntrue; } } returnfalse; } }

只出現一次的數字

//先用temp暫存一個數 //然後迴圈整個陣列求出該元素出現的次數time //若整輪下去time==1,則返回這個數
classSolution{ publicintsingleNumber(int[]nums){ //求陣列nums的長度 intn=nums.length; for(inti=0;i<n;i++){ inttemp=nums[i]; inttime=0; for(intj=0;j<n;j++){ if(temp==nums[j]){ time++; } } if(time==1){ returnnums[i]; } } return0; } }

兩個陣列的交集 II

//先對nums1陣列和nums2陣列進行從小到大的排序 //設一個數組num,長度和nums1、nums2中的最小長度一樣 //若nums1和nums2的元素相同,則存入nums中 //否則,最小的那一個數組的序號往後移一位,直到num1或num2陣列的序號移動最後面 classSolution{ publicint[]intersect(int[]nums1,int[]nums2){ //排序陣列nums1和nums2 Arrays.sort(nums1); Arrays.sort(nums2);
//求陣列nums1和陣列nums2的長度 intn1=nums1.length; intn2=nums2.length;
//設一個新陣列 intn=0; if(n1>n2){ n=n2; }else{ n=n1; } int[]nums=newint[n]; //開始往nums中存數 //i代表nums1的序號,j代表nums2的序號,k代表nums的序號 inti=0; intj=0; intk=0; while(i<n1&&j<n2){ if(nums1[i]==nums2[j]){ nums[k]=nums1[i]; i++; j++; k++; }elseif(nums1[i]<nums2[j]){ i++; }else{ j++; } } //Arrays.copyOfRange(nums,from,to) //複製陣列nums,from下標開始,to下標結束.但是不包括to. returnArrays.copyOfRange(nums,0,k); } }

加一

//若不全為0,則從後往前找第一個不為9的元素,並且將其加1,其後面的元素都要置為0 //若陣列的元素都是9,那麼重新設一個數組,陣列長度是原始陣列長度+1,頭一個元素設定為1
classSolution{ publicint[]plusOne(int[]digits){ //求陣列digits的長度 intn=digits.length; //尋找第一個不為9的元素,若找到後且不是第一個元素,則將其加1並且後面的元素都置為0 for(inti=n-1;i>=0;--i){ if(digits[i]!=9){ digits[i]++; for(intj=i+1;j<n;j++){ digits[j]=0; } returndigits; } }
//若陣列的元素都為9,則重新設定一個數組,陣列長度為原來陣列長度加1 int[]rev=newint[n+1]; rev[0]=1; returnrev; } }

移動零

//設定兩個指標 //slow指標用來定位第一個是0的序號 //fast指標用來定位當前的序號 //當fast指標指向的元素不為0的時候,slow中的元素與fast中的元素交換 classSolution{ publicvoidmoveZeroes(int[]nums){ //求nums的長度 intn=nums.length;
//遍歷整個陣列,尋找第一個為0的序號和第一個不為0的序號 intfast=0; intslow=0; while(fast<n){ if(nums[fast]!=0){ swap(nums,fast,slow); slow++; } fast++; } } //交換 publicvoidswap(int[]jh,intfast,intslow){ inttemp=jh[fast]; jh[fast]=jh[slow]; jh[slow]=temp; } }

兩數之和

//暴力解法
classSolution{ publicint[]twoSum(int[]nums,inttarget){ //求陣列nums的長度 intn=nums.length;
inti=0; intj=0; for(i=0;i<n-1;i++){ for(j=i+1;j<n;j++){ if(target==(nums[i]+nums[j])){ returnnewint[]{i,j}; } } } returnnewint[0]; } }

有效的數獨

//設定三個陣列分別儲存行,列,三三是否有重複的 //設行row為二維陣列,第一個標識著第幾行,第二個表示該數出現了幾次 //設列column為二維陣列,第一個標識著第幾列,第二個表示該數出現了幾次 //設Three為三維陣列,前兩維表示哪個三維陣列,後一位表示該數在該三維陣列中出現了幾次
classSolution{ publicbooleanisValidSudoku(char[][]board){ int[][]rows=newint[9][9]; int[][]columns=newint[9][9]; int[][][]subboxes=newint[3][3][9]; for(inti=0;i<9;i++){ for(intj=0;j<9;j++){ charc=board[i][j]; if(c!='.'){ intindex=c-'0'-1; rows[i][index]++; columns[j][index]++; subboxes[i/3][j/3][index]++; if(rows[i][index]>1||columns[j][index]>1||subboxes[i/3][j/3][index]>1){ returnfalse; } } } } returntrue; } }

旋轉影象

//旋轉90度,相當於先水平(中間)對換,再對角線(135度方向)對換;
classSolution{ publicvoidrotate(int[][]matrix){ //求的是matrix的行數,或列數;行數=列數 intn=matrix.length;
//水平對換 for(inti=0;i<n/2;i++){ for(intj=0;j<n;j++){ inttemp=matrix[i][j]; matrix[i][j]=matrix[n-i-1][j]; matrix[n-i-1][j]=temp; } }
//對交換對換 for(inti=0;i<n;i++){ for(intj=0;j<i;j++){ inttemp=matrix[i][j]; matrix[i][j]=matrix[j][i]; matrix[j][i]=temp; } } } }