1. LeetCode热题100解析(四):数组与链表高频算法精讲
作为程序员面试的"金标准",LeetCode题目一直是技术求职路上的必经关卡。今天我将分享自己在刷题过程中总结的10道高频数组和链表题目解法,这些题目来自LeetCode热题100榜单,覆盖了旋转数组、螺旋矩阵、环形链表等经典问题。不同于简单的代码展示,我会重点讲解解题思路的演进过程、不同解法的性能对比,以及实际面试中的考察重点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数组类问题解析
2.1 轮转数组的三种解法比较
轮转数组(189题)要求将数组元素向右移动k个位置。初学者最容易想到的是使用额外数组的解法:
java复制public void rotate(int[] nums, int k) {
int[] clone = nums.clone();
for (int i = 0; i < nums.length; i++) {
int index = (i + k) % nums.length;
nums[index] = clone[i];
}
}
这种解法时间复杂度O(n),空间复杂度O(n)。面试官通常会追问能否优化空间复杂度,这就引出了经典的"三次反转法":
java复制public void rotate(int[] nums, int k) {
k = k % nums.length; // 处理k大于数组长度的情况
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
private void reverse(int[] nums, int start, int end) {
while(start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
关键点:三次反转法将空间复杂度降为O(1),是面试中的加分项。注意要处理k大于数组长度的情况,否则会导致数组越界。
2.2 除自身以外数组乘积的巧妙解法
238题要求计算数组中每个元素除自身外的乘积,且不能用除法。这个限制让很多初学者束手无策,其实可以通过前缀积和后缀积的组合来解决:
java复制public int[] productExceptSelf(int[] nums) {
int[] left = new int[nums.length];
left[0] = 1;
for (int i = 1; i < nums.length; i++) {
left[i] = nums[i - 1] * left[i - 1];
}
int right = 1;
int[] answer = new int[nums.length];
for (int i = nums.length - 1; i >= 0; i--) {
answer[i] = left[i] * right;
right *= nums[i];
}
return answer;
}
这个解法的时间复杂度是O(n),空间复杂度优化到O(1)(不考虑输出数组)。在实际编码时要注意:
- 初始化left数组的第一个元素为1(因为第一个元素没有前缀)
- 后缀积可以用一个变量right动态计算,避免使用额外数组
- 最后的结果是前缀积和后缀积的乘积
3. 矩阵类问题精解
3.1 矩阵置零的空间优化技巧
73题要求将矩阵中0元素所在的行和列都置零。最直观的解法是使用两个标记数组:
java复制public void setZeroe
