array专题
581 Shortest Unsorted Continuous Subarray
問題:這道題目感概頗多,作為第一個array的簡單題目就被纏住了。具體內(nèi)容寫在注釋里面了。
217 Contains Duplicate
問題:這道題目可以看出有效的數(shù)字組合就是0,10,11三種組合。當(dāng)遍歷到某一位是0,下標(biāo)加1;某一位是1,下標(biāo)加2.如果到最后只剩下最后一位,并且是0,返回true。
學(xué)習(xí):我用遞歸實(shí)現(xiàn)的,看了一個方法用循環(huán)實(shí)現(xiàn)了,代碼簡潔。
代碼
118 Pascal’s Triangle
問題:利用楊輝三角形的性質(zhì)
1 楊輝三角形以正整數(shù)構(gòu)成,數(shù)字左右對稱,每行由1主鍵變大,然后變小,變回1;
2 第n行,數(shù)字個數(shù)為n;
3 第n行,第k個數(shù)字為組合數(shù)C(k?1)(n?1)C(n?1)(k?1)
4 除每行最左側(cè)與最右側(cè)元素外,每個數(shù)字等于它的左上方與右上方數(shù)字之和。
代碼
695 Max Area of Island
問題:計(jì)算小島的最大面積,與 85 最大矩形面積的區(qū)別是:島的面積只要連通就行,不一定要形成矩形。體現(xiàn)在深度優(yōu)先搜索上不同。這道題目的精妙還在計(jì)算過就讓grid[i][j] = 0,這樣就不會重復(fù)計(jì)算了。這是我沒有想到的。
代碼
628 Maximum Product of Three Numbers
問題:題目的輸入是一個整數(shù)數(shù)組,有正數(shù),有負(fù)數(shù)。要求輸出這些數(shù)組中任意三個數(shù)字乘積的最大值。
我的想法:最大乘積或者是三個最大正數(shù)的乘積,或者是兩個具有最大絕對值的負(fù)數(shù)乘以最大的正數(shù)。那么我是不是可以按照數(shù)字的絕對值從大到小排序。然后找前三個數(shù)字相乘就可以。可以嗎?不可以。因?yàn)槭前凑战^對值排序的,所以如果前三個數(shù)字恰好都是正數(shù),那也罷了。如果其中一個,原來的數(shù)是負(fù)數(shù),這個結(jié)果就不對了。
學(xué)習(xí):思路的第一句是對的。只是處理方法不對。不應(yīng)該按照數(shù)組元素的絕對值排序,這樣之后再也找不到對應(yīng)的原數(shù)字,會出問題。應(yīng)該看到兩個具有最大絕對值的負(fù)數(shù)就是整個數(shù)組中最小的兩個數(shù)。如果能看到這個,就能找到解決方法了。
學(xué)習(xí)2:最大乘積或者是三個最大正數(shù)的成績,或者是兩個具有最大絕對值的負(fù)數(shù)乘以最大的正數(shù)。對這句話可以再理解:找到最大的三個數(shù)max1,max2,max3,最小的兩個數(shù)min1,min2。這應(yīng)該一次循環(huán)就可以搞定,無需排序。有時候離成功就是那么近,目標(biāo)設(shè)立對了,方法卻錯了。
public int maximumProductV2(int[] nums) {int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;for (int num : nums) {if (num > max1) {max3 = max2;max2 = max1;max1 = num;}else if(num > max2){max3 = max2;max2 = num;}else if(num > max3){max3 = num;}if (num < min1) {min2 = min1;min1 = num;}else if(num<min2){min2 = num;}}return Math.max(max1 * max2 * max3, min1 * min2 * max1);}代碼
414 Third Maximum Number
問題:題目簡單,只要注意第三大數(shù)字=第三大不同的數(shù)字,注意去重。而且題目還給了一組最小的數(shù)字-2146473648.
public int thirdMax(int[] nums) {int max1 = Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;int cnt = 0;boolean minvalue = true;for(int num:nums){if (num > max1) {max3 = max2;max2 = max1;max1 = num;cnt++;}else if(num > max2 && num!=max1){max3 = max2;max2 = num;cnt++;}else if(num > max3 && num!=max1 && num!=max2){max3 = num;cnt++;}else if(num==Integer.MIN_VALUE && minvalue){cnt++;minvalue = false;}}return cnt<3?max1:max3;}643 Maximum Average Subarray I
問題:要找到長度為k的平均值最大的子數(shù)組的平均值。只要找到符合條件的子數(shù)組即可。題目可以先用for循環(huán),指定子數(shù)組的起始位置、結(jié)束位置計(jì)算;然后會發(fā)現(xiàn)超時,為了減少重復(fù)的加和步驟,使用滑動窗口的方式。這種窗口滑動的方式在nlp的算法和深度學(xué)習(xí)中都有使用。
public double findMaxAverageV3(int[] nums, int k) {int n = nums.length;int sum = 0;for (int i = 0; i < k; i++) {sum += nums[i];}int maxSum = sum;for (int i = k; i < n; i++) {sum += nums[i] - nums[i - k];maxSum = Math.max(maxSum, sum);}return (maxSum+0.0)/k;}448 Find All Numbers Disappeared in an Array
問題:題目簡單。輸入一個數(shù)組,數(shù)組元素是[1,n],n是數(shù)組長度。有些元素可能重復(fù),有些元素可能沒出現(xiàn)。返回沒有出現(xiàn)的元素。要求不用額外的空間,用O(n)時間復(fù)雜度完成。
我的思路:先使用一個新數(shù)組data,長度為n+1。遍歷入?yún)ums,設(shè)置data[nums[i]]=1。最后遍歷data[i]=1就表示i出現(xiàn)過,否則就沒有出現(xiàn)。所以關(guān)鍵是標(biāo)記出出現(xiàn)的元素。可以用數(shù)組下標(biāo)和出現(xiàn)的元素關(guān)聯(lián)起來。如果沒有新數(shù)組data,那就在原數(shù)組nums上做修改。修改的方式有很多種,例如設(shè)置為0,設(shè)置為負(fù)數(shù),原數(shù)組值+n等等。我自己實(shí)現(xiàn)的修改數(shù)組值為0,方式不夠漂亮,參考了原數(shù)組值+n的方式。
代碼
724 Find Pivot Index
問題:從左向右一次選擇pivot的index 當(dāng)選擇pivot index 為i的時候leftsum=sum(0,i-1),rightsum=sum(i+1,n-1) ;當(dāng)選擇pinot index 為(i+1)的時候,leftsum=sum(0,i)=sum(0,i-1)+a[i] rigtsum=sum(i+2,n-1)=sum(i+1,n-1)-a[i+1]。注意:左邊可以是0個元素,右邊也可以是0個元素
學(xué)習(xí):更加簡潔版本。leftsum + rightsum + nums[i] = sum,所以leftsum和rightsum只要計(jì)算一個就可以。只是沒有想明白為什么這個版本更慢了。(pivotIndexV2)
代碼
總結(jié)
- 上一篇: SQL SERVER 2005 数据库置
- 下一篇: ssh开发流程