最近刷了两题力扣题,一题是二这题,是属于困难题系列。作完了发现困难题就是和简单题有不同的地方,考虑的角度都不同了。java
题目要求很简单,滑动窗口最大值,有点像操做系统里的最小窗口置换和工做集页面置换方法。测试
下面是方法一:一看这个循环里面套循环,最底层还有一个有个条件语句,谁看了这种代码,不摇头,不叹气,这种代码不用算都知道时间复杂度超级高。好吧,就是力扣过不去,力扣要求一分钟。进行了改进。操作系统
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int len,count; len=nums.length; int data[] = new int[len-k+1]; for(int i=0;i<len-k+1;i++) { int max=nums[i]; for(int j=i;j<i+k;j++) { if(nums[j]>max) { max=nums[j]; } } data[count]=max; count++; } return data; } }
方法二:十分努力尽可能的减小了双重循环里的语句数,可是仍是没法经过一分钟测试(小声哔哔,我十分怀疑是电脑问题)blog
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if (nums == null || nums.length == 0) return new int[0]; int data[] = new int[nums.length-k+1]; for(int i=0;i<nums.length-k+1;i++) { int max=nums[i]; for(int j=1;j<k;j++) { max=Math.max(max,nums[i+j]); } data[i]=max; } return data; } }
而后我去看了大佬的解析,大佬们使用的是双端队列,我那时候以为听起来就很高大上,而后我今天遇到了,LinkedList就是一种双端队列。等过几天再去仔细从新思考这一题,搁置。队列