当前位置: 首页 > news >正文

昭通网站seo优化西安seo服务商

昭通网站seo优化,西安seo服务商,产品设计平台有哪些,软件开发文档的作用#697 Degree of an Array 我承认慢慢有了思路的前提是你要见过那些解法#xff0c;否则怎么想也想不到。多做题目#xff0c;就像是多看书一样重要。 问题#xff1a;一个数组的度这个数组中出现次数最多元素的出现次数。要找的是最短的子数组#xff0c;而这个数组的度原数…#697 Degree of an Array 我承认慢慢有了思路的前提是你要见过那些解法否则怎么想也想不到。多做题目就像是多看书一样重要。 问题一个数组的度这个数组中出现次数最多元素的出现次数。要找的是最短的子数组而这个数组的度原数组的度。 思路一我肯定需要一次循环找到数组的度接着计算每个子数组计算它们的度找到和原数组的度相同的最短的子数组。每个子数组就是从下标0开始的子数组从下标1开始的子数组…。所以有了如下代码。代码时间复杂度O(n^2)发生TLE。 public int findShortestSubArray(int[] nums) {// 数组的度MapInteger, Integer countMap new HashMapInteger, 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) {MapInteger, Integer subCoutMap new HashMapInteger, 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-start1, 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) {// 数组的度MapInteger, Integer countMap new HashMapInteger, 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));}ListInteger elementList new ArrayListInteger();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-start1);break;}}}}return minLength;}思路三上面的三步有没有可以合并的呢是不是可以在计算数组的度的时候顺便记录下每个元素的起止位置呢当然可以。第二步寻找出现次数等于数组度的元素和计算子数组长度放在一起。于是有了以下代码。 public int findShortestSubArrayV3(int[] nums) {MapInteger, Integer countMap new HashMapInteger, Integer();MapInteger, Integer[] numIndexMap new HashMapInteger, 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先准备基础数据再计算。不得不说作者真是牛。作者代码更注重的细节是Maplt;Integer,int[]gt;numMapMaplt;Integer, int[]gt; numMapMapInteger,int[]numMap 而不是$ MapInteger, Integer[] numMap $我试过了速度更快。map的get方法尽量调用一次看我上面代码就知道我不是这样做的。作者在最后遍历的是numMap.values()速度更快。 public int findShortestSubArrayV4(int[] nums) {if (nums.length 0 || nums null) return 0;MapInteger, int[] numMap new HashMapInteger, 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) {MapInteger,Integer left new HashMapInteger,Integer();MapInteger,Integer right new HashMapInteger,Integer();MapInteger,Integer count new HashMapInteger,Integer();int degree 0; for(int i0;inums.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;}
http://www.pierceye.com/news/508692/

相关文章:

  • 做蓝牙app的网站跨境电商是不是坑
  • 电子商务网站开发 刘兰娟企业网站建设发展平台
  • 天津做网站得公司游戏界面设计网站
  • 手机网站制作推广网站开发制作培训学校
  • 网站建设需要哪些成本自媒体怎么赚钱
  • 手机怎么访问微网站网站建设市场调研框架
  • 前端网站主题怎么做业务外包的优势和劣势
  • 西安模板网站建设套餐保定seo排名外包
  • 自己做的网站怎么设置文件下载北京朝阳区楼盘
  • h网站建设揭阳网站如何制作
  • phpstudy建设网站教程微信小程序开发需要什么
  • 快手刷评论推广网站网站几个数据库
  • 山东网站建设网站我国网站开发
  • 常见的网站类型有北京电力建设公司待遇
  • 网站分析流程wordpress表单统计插件下载
  • 南宁网站建设公司seo优化武鸣住房和城乡规划建设局网站
  • 在线制作网站门户站模板
  • 邵阳网站建设推广56m做图片视频的网站是什么
  • 如何提高网站的点击率域名空间网站推广
  • 上海松江做网站建设wordpress 拒绝连接
  • 有免费的个人网站吗富德生命人寿保险公司官方网站保单服务
  • 网站备案 子域名网页视频制作软件
  • 空间 网站网站建设哪个好
  • 公司网站域名价格云南免费网站建设
  • 网站跳转域名不变常见网站架构
  • 山东省建设厅电工证查询网站网站标题的选择
  • 网站建设是属于软件吗电话销售哪里找客户电话
  • 用vue做网站的实例网站制作郑州
  • 五个网站想自己在家做外贸网站
  • 收费的电影网站怎么做网页设计图片的应用