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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

array专题3-一道题目不断分析就会慢慢有了思路

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 array专题3-一道题目不断分析就会慢慢有了思路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#697 Degree of an Array
我承認慢慢有了思路的前提是你要見過那些解法,否則怎么想也想不到。多做題目,就像是多看書一樣重要。
問題:一個數組的度=這個數組中出現次數最多元素的出現次數。要找的是最短的子數組,而這個數組的度=原數組的度。
思路一:我肯定需要一次循環,找到數組的度;接著計算每個子數組,計算它們的度,找到和原數組的度相同的最短的子數組。每個子數組就是從下標0開始的子數組,從下標1開始的子數組…。所以有了如下代碼。代碼時間復雜度O(n^2),發生TLE。

public int findShortestSubArray(int[] nums) {// 數組的度Map<Integer, Integer> countMap = new HashMap<Integer, Integer>();int degree = 0;for (int num : nums) {if (countMap.get(num) == null) {countMap.put(num, 1);} else {countMap.put(num, 1 + countMap.get(num));}degree = Math.max(degree, countMap.get(num));}// 找子數組int minlength = nums.length;for (int start = 0; start < nums.length; start++) {Map<Integer, Integer> subCoutMap = new HashMap<Integer, Integer>();int subDegree = 0;for (int end = start; end < nums.length; end++) {int num = nums[end];if (subCoutMap.get(num) == null) {subCoutMap.put(num, 1);} else {subCoutMap.put(num, 1 + subCoutMap.get(num));}subDegree = Math.max(subDegree, subCoutMap.get(num));if(subDegree == degree){minlength = Math.min(end-start+1, minlength) ;break;}}}return minlength;}

思路二:需要把兩層循環改為1層。觀察例子中給出的子數組:[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2],符合條件的是[2,2]。既然數組的度是由出現次數最多的元素的頻次貢獻的,那子數組中肯定包含這個元素。要求最短,那子數組的起始元素和結束元素肯定都是這個元素。所以思路改為:
1 需要一次循環,找到數組的度;
2接著再循環找到這個度是由哪個元素貢獻的。例如數組 [1, 2, 2, 3, 1]的度是2,是由元素2貢獻的。找到2這個元素;
3最后要循環找到這個元素的起止位置,計算子數組的長度。
所以有了如下代碼。注意的是:出現次數最多的元素可能不止一個。

public int findShortestSubArrayV2(int[] nums) {// 數組的度Map<Integer, Integer> countMap = new HashMap<Integer, Integer>();int degree = 0;for (int num : nums) {if (countMap.get(num) == null) {countMap.put(num, 1);} else {countMap.put(num, 1 + countMap.get(num));}degree = Math.max(degree, countMap.get(num));}List<Integer> elementList = new ArrayList<Integer>();for(Integer num : countMap.keySet()){if(countMap.get(num)==degree){elementList.add(num);}}int minLength = nums.length;for(int element : elementList){int subDegree = 0;int start = -1;for (int i = 0; i < nums.length; i++) {if(nums[i] == element){if(start == -1){start = i;}subDegree++;if(subDegree == degree){minLength = Math.min(minLength, i-start+1);break;}}}}return minLength;}

思路三:上面的三步有沒有可以合并的呢?是不是可以在計算數組的度的時候,順便記錄下每個元素的起止位置呢?當然可以。第二步尋找出現次數等于數組度的元素,和計算子數組長度放在一起。于是有了以下代碼。

public int findShortestSubArrayV3(int[] nums) {Map<Integer, Integer> countMap = new HashMap<Integer, Integer>();Map<Integer, Integer[]> numIndexMap = new HashMap<Integer, Integer[]>();int degree = 0;for (int i = 0; i < nums.length; i++) {int num = nums[i];if (countMap.get(num) == null) {countMap.put(num, 1);} else {countMap.put(num, 1 + countMap.get(num));}degree = Math.max(degree, countMap.get(num));if(numIndexMap.get(num)==null){numIndexMap.put(num, new Integer[]{i,i});}else{numIndexMap.get(num)[1] = i;}}int minLength = nums.length;for(int num : countMap.keySet()){if(countMap.get(num) == degree){minLength = Math.min(minLength, numIndexMap.get(num)[1] - numIndexMap.get(num)[0]+1);}}return minLength;} 一步一步改進自己的思路。從最直覺入手。改進的依據是觀察標準答案的特征;縮短使用時間。

思路四:看了discuss。兩個map合并為一個map,先準備基礎數據再計算。不得不說,作者真是牛。作者代碼更注重的細節是:Map&lt;Integer,int[]&gt;numMapMap&lt;Integer, int[]&gt; numMapMap<Integer,int[]>numMap 而不是$ Map<Integer, Integer[]> numMap $,我試過了,速度更快。map的get方法盡量調用一次(看我上面代碼就知道,我不是這樣做的)。作者在最后遍歷的是numMap.values(),速度更快。

public int findShortestSubArrayV4(int[] nums) {if (nums.length == 0 || nums == null) return 0;Map<Integer, int[]> numMap = new HashMap<Integer, int[]>();for (int i = 0; i < nums.length; i++) {int num = nums[i];if (numMap.get(num) == null) {numMap.put(num, new int[]{1,i,i});} else {int[] temp = numMap.get(num);temp[0]++;temp[2]=i;}}int degree = 0;int minLength = nums.length;for(int[] values : numMap.values()){if(degree < values[0]){degree = values[0];minLength = values[2]-values[1] +1;}else if(degree == values[0]){minLength = Math.min(minLength, values[2]-values[1] +1);}}return minLength;}

思路5:第二遍刷題。觀察到了需要找到出現最多次數元素最左邊、最右邊的位置。

public int findShortestSubArray(int[] nums) {Map<Integer,Integer> left = new HashMap<Integer,Integer>();Map<Integer,Integer> right = new HashMap<Integer,Integer>();Map<Integer,Integer> count = new HashMap<Integer,Integer>();int degree = 0; for(int i=0;i<nums.length;i++){if(left.get(nums[i])==null) left.put(nums[i],i);right.put(nums[i],i);if(count.get(nums[i])==null)count.put(nums[i],1);elsecount.put(nums[i],count.get(nums[i])+1);degree = Math.max(degree,count.get(nums[i]));}int answer = nums.length;for(Integer num : left.keySet()){if(count.get(num)==degree){answer = Math.min(answer,right.get(num)-left.get(num)+1);}}return answer;}

總結

以上是生活随笔為你收集整理的array专题3-一道题目不断分析就会慢慢有了思路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 性生交大片免费看l | 在线高清免费观看 | 五月婷婷激情综合网 | 久久久久二区 | 国产片淫乱18一级毛片动态图 | 大香蕉精品一区 | 老鸭窝一区二区 | 淫品色影院 | 成人在线观看免费 | 亚洲av无码国产精品久久 | 喷水了…太爽了高h | 国产剧情一区二区三区 | 美女被草出白浆 | 国产成人精品视频在线观看 | 美女日批在线观看 | 日韩中文字幕免费视频 | www国产成人 | 欧美激情国产日韩精品一区18 | 99国产揄拍国产精品 | 森泽佳奈av | 日韩中文字幕免费视频 | 欧美性色a | 一区二区三区 中文字幕 | 国产精品美女久久久久久久久 | 大肉大捧一进一出好爽 | 亚洲精品网站在线观看 | 精品麻豆 | 精品一区二区三区欧美 | 性xxxx欧美老肥妇牲乱 | 亚洲国产一区二区三区四区 | 深爱激情久久 | 免费瑟瑟网站 | 欧美久久综合网 | jizz成熟丰满日本少妇 | av手机在线免费观看 | 欧美成片vs欧美 | 一级黄色免费网站 | 日韩美一区二区 | 日本免费黄色大片 | 欧美肉大捧一进一出免费视频 | 九色视频丨porny丨丝袜 | 国产九九九九 | 国产成人午夜精华液 | 又黄又爽又色的视频 | 久久e热 | 91高跟黑色丝袜呻吟在线观看 | 亚洲性生活网站 | 一二三四视频社区在线 | 国产稀缺精品盗摄盗拍 | 肉色超薄丝袜脚交一区二区图片 | 国产精品夜色一区二区三区 | 91在线看黄 | 亚洲国产999| 假日游船法国满天星 | 亚洲一区二区 | 一级片免费视频 | 天堂av日韩 | 欧美熟妇另类久久久久久不卡 | 91精品亚洲 | 9i在线看片成人免费 | 粉嫩久久99精品久久久久久夜 | 高潮一区二区三区 | 九色麻豆| 午夜污污 | 国产精品七区 | 里番acg★同人里番本子大全 | 欧美丰满bbw | 四虎影院免费 | 欧美福利视频一区二区 | 国产精品久久久久久久久久久久久久久久 | 暗呦丨小u女国产精品 | 国产情侣在线视频 | 免费爱爱网站 | 亚洲日本成人在线观看 | 久久久久久久蜜桃 | 成人导航网站 | 伦乱天堂 | 国产三级按摩推拿按摩 | 欧美日韩在线免费视频 | 亚洲国产图片 | 黑人中文字幕一区二区三区 | 看黄色一级视频 | 沈樵精品国产成av片 | 日韩女优在线播放 | 国产毛片毛片毛片毛片毛片毛片 | 色狠久| 色婷婷国产精品 | 朝桐光av一区二区三区 | 午夜免费| 嫩草影院久久 | 男女午夜免费视频 | 插插插干干干 | 精品一区二三区 | 免费中文字幕日韩欧美 | 天天艹日日干 | 五月伊人婷婷 | 91免费观看入口 | 欧美中文视频 | 日韩极品一区 |