代码随想录算法训练营 Day2 | 数组 | LC.977、LC.209...欢迎来到代码随想录算法训练营的第二天!今天我们正式进入数组这个基础数据结构的实战环节。数组作为算法面试中最常见的主题之一,掌握它能帮助你快速攻克许多中等难度的题目。我们将重点剖析LeetCode 977、有序数组的平方、LeetCode 209、长度最小的子数组等经典问题,通过一步步拆解,带你从暴力解法优化到双指针技巧,轻松提升代码能力。首先,来聊聊LeetCode 977,有序数组的平方。这个题目看似简单,却藏着数组排序的优化之道。给你一个有序的整数数组nums,其中元素可以是正数、负数或零,要求返回每个元素的平方后重新排序的数组。举个例子,输入[-4,-1,0,3,10],输出应该是[0,1,9,9,16]。如果你直接暴力求平方后排序,时间复杂度O(n log n),在LeetCode上能过,但面试中容易被追问优化空间。聪明的方法是用双指针。因为原数组有序,平方后负数部分会变成大正数,正数部分从小到大。我们从两端入手:左指针i指向最小负数(平方最大),右指针j指向最大正数(平方也最大)。比较nums[i]nums[i]和nums[j]nums[j]的大小,将较大的放入结果数组末尾,并移动对应指针。这样,整个过程只需O(n)时间,空间O(n),高效又优雅。代码实现上,先创建一个结果数组res = new int[nums.length],然后i=0, j=nums.length-1,k=j从后往前填充。while(i<=j)里比较平方值,填充后i++或j--。最后如果i>j,直接返回res。记住,原地优化还能进一步压缩空间到O(1),但新手先掌握双指针思路即可。接下来是LeetCode 209,长度最小的子数组。给定一个包含正整数的数组和目标值target,返回连续子数组中和>=target的最短长度。如果不存在,返回0。例如,nums=[2,3,1,2,4,3],target=7,最短子数组[4,3]长度2。暴力双层循环O(n^2)能过小数据,但大数据超时。这里引入滑动窗口技巧,完美契合“正整数求和>=target”的场景。定义left=0,sum=0,minLen=Integer.MAX_VALUE。用右指针right从0到n-1扩展窗口:sum += nums[right],然后while(sum >= target && left <= right)收缩左边界sum -= nums[left++],同时更新minLen = Math.min(minLen, right-left+1)。时间O(n),因为每个元素最多进出窗口一次。这个技巧是数组子序列问题的利器,后续如238、53等题都能复用。记住,滑动窗口的核心是“单调性”:右扩左缩保持窗口有效。Day2的数组训练不止这两题,还延伸到LC.53最大子数组和(Kadane算法)、LC.1两数之和(哈希优化)。通过这些,你会发现数组问题往往从暴力入手,双指针或哈希收尾。
全新影像技术即将革新手机摄影界——小米磁吸镜头L000或将引领潮流旅途中还邂逅了许多有趣的当地居民和游客,他们分享了关于这座山地的历史故事以及个人旅行经历。这些故事不仅丰富了我们的行程,也让我们更加深刻地了解到了南山文化旅游区背后的文化价值。
2026-03-10 10:58:01