日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

array专题

發(fā)布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 array专题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)了,代碼簡潔。

public boolean isOneBitCharacterV2(int[] bits) {int n = bits.length;int i = 0;while (i < n - 1) {if (bits[i] == 0)i++;elsei += 2;}return i == n - 1;}

代碼

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ù)。如果能看到這個,就能找到解決方法了。

public int maximumProductV3(int[] nums) {Arrays.sort(nums);int n = nums.length;return Math.max(nums[0]*nums[1]*nums[n-1], nums[n-1]*nums[n-2]*nums[n-3]);}

學(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é)

以上是生活随笔為你收集整理的array专题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。