公众号做漫画网站,移动端网站做排名,Wordpress 建站 软件,asp网站背景#x1f58a;作者 : D. Star. #x1f4d8;专栏 : 算法小能手 #x1f606;今日分享 : 你知道北极熊的皮肤是什么颜色的吗#xff1f;#xff08;文章结尾有答案哦#xff01;#xff09; 文章目录 力扣的209题✔解题思路✔代码:✔总结: 力扣的3题✔解题思路#xff1a… 作者 : D. Star. 专栏 : 算法小能手 今日分享 : 你知道北极熊的皮肤是什么颜色的吗文章结尾有答案哦 文章目录 力扣的209题✔解题思路✔代码:✔总结: 力扣的3题✔解题思路✔代码✔总结 力扣的1004题✔解题思路✔代码✔总结 力扣的1658题✔做题思路✔代码✔总结感谢家人的阅读,不准确的地方 欢迎在评论区指正! 力扣的209题
做题链接209
✔解题思路
先用左右指针left , right从最左边开始找右指针先动
利用单调性当你找到第一个 target 时右指针就不用再向右边找了因为我们要找的是最短的子数组再向右的子数组肯定是比第一次找到的长。移动左指针在原来的和的基础上减去前一个左指针的值leftright找到和 target 的子数组长度如果比之前的子数组长度短就覆盖。细节问题符合长度的子数组 len 初始值赋多少由于不清楚输入数组的长度并且万一没有符合条件的子数组返回的值就会出错。所以建议赋值整型的最大值 Integer.MAX_VALUES。
✔代码: public static int minSubArrayLen2(int target, int[] nums) {int n nums.length,sum 0,len Integer.MAX_VALUE;for(int left 0,right 0;rightn;right){sumnums[right];while (sumtarget){len Math.min(len,right-left1);sum-nums[left];}}return len Integer.MAX_VALUE?0:len;}✔总结:
没注意到或者说是没有理解题目中的连续子数组 这个字眼,上来就sort()了我的做法是找到最大的数字然后在他的左边和右边开始找长度最小的子数组但是后来发现行不通。正确做法用滑动窗口“同向双指针”。
力扣的3题
做题链接力扣3题
✔解题思路
将字符串转化为字符数组。用数组代换Hash表。int[] hash new int[128];//这里的128刚好囊括了所有阿斯克码值(0-127)。 先入窗口然后判断若符合判断则出窗口不符合则得出结果最后循环更新结果。
✔代码 public static int lengthOfLongestSubstring2(String ss) {char[] s ss.toCharArray();//用数组代换Hash表int[] hash new int[128];//这里的128刚好囊括了所有阿斯克码值(0-127)int right 0, left 0, ret 0;while (right s.length) {hash[s[right]];//让s[right]所在的阿斯克码值1----入窗口while (hash[s[right]] 1) {//说明该字母已存在hash[s[left]]--;//让s[left]所在的阿斯克码值-1----窗口}ret Math.max(ret,right-left1);right;}return ret;}✔总结
这题用到了Hash表的思想,用数组代替阿斯克码值,很巧妙。
力扣的1004题
做题链接力扣1004题
✔解题思路
right先进窗口如果是1跳过如果是0k–。判断k的值如果k值0则遇0无法再翻牌子则出窗口left遇到1无视遇到0k得出结果更新结果
✔代码 public static int longestOnes2(int[] nums, int k) {int n nums.length, kk k, left 0, right 0, len 0;while (right n) {//先进窗口if (nums[right] 0) {kk--;right;}else right;//判断kk的值while (kk 0) {if (nums[left] 0) kk;}//计算长度len Math.max(len, right - left);}return len;}✔总结
这题写的时候有点迷糊没想到这种方法老师刚讲的时候还感觉挺懵的但是细想也挺简单的就像是求俩数之和一样要使得k0才行。这题还是需要多复盘一下的
力扣的1658题
做题链接力扣1658
✔做题思路
重要思路正难则反
计算出整个数组sum 的值和target 代表窗口里的和sum-x的值进窗口【并计算出窗口内tmp的值】判断tmp 和target 的关系【则left则right则计算len】出窗口就是上面的【则left】更新结果就是上面的【则计算len】
✔代码 public static int minOperations(int[] nums, int x) {//1. 计算出整个数组sum的值和target代表窗口里面的和sum-x的值int sum 0;for (int i : nums) sum i;int target sum - x;//细节//如果target0即xsum则直接返回-1if(target0) return -1;//2. 进窗口int left 0, right 0, tmp 0, len -1;//这里长度len设为-1有两个好处// 1. 题目要求没有符合条件的就返回-1。// 2.最后可以判断如果len是-1则直接返回-1否则返回num.length。while (right nums.length) {tmp nums[right];//3. 判断窗口里面的值while (tmp target) {//大于target[left]//4. 出窗口tmp - nums[left];}if (tmp target) {// 等于target计算窗口长度//5. 更新长度len Math.max(len, right - left1);}// 小于targetright//6. 进窗口right;}if(len -1) return len;return nums.length-len;}✔总结
这题刚开始的时候理解错题目意思了我上来就给数组排序然后总有一些例子过不去后来知道了题目的意思是在原来的顺序上进行移动但是无从下手。看了老师的解题步骤和思路觉得很精妙 答案北极熊的皮肤是黑色的我也是今天才知道…涨知识了~ 感谢家人的阅读,不准确的地方 欢迎在评论区指正!