Easy
题目描述
给定一个循环数组 nums,找出相邻元素之间的最大绝对差值。
注意:在循环数组中,第一个和最后一个元素是相邻的。
示例 1:
输入:nums = [1,2,4]
输出:3
解释:
因为 nums 是循环的,nums[0] 和 nums[2] 是相邻的。它们的最大绝对差值为 |4 - 1| = 3。
示例 2:
输入:nums = [-5,-10,-5]
输出:5
解释:
相邻元素 nums[0] 和 nums[1] 的最大绝对差值为 |-5 - (-10)| = 5。
约束条件:
2 <= nums.length <= 100-100 <= nums[i] <= 100
提示:
- 从第二个元素到最后一个元素遍历,检查每对相邻元素的差值。
- 边界情况是检查第一个和最后一个元素之间的差值。
解题思路
这道题考查的是在循环数组中寻找相邻元素的最大绝对差值。关键理解是循环数组意味着最后一个元素和第一个元素也是相邻的。
解题思路
基本思路: 我们需要检查所有相邻元素对的绝对差值,包括:
- 相邻的普通元素对:
nums[i]和nums[i+1](i从0到n-2) - 循环边界:
nums[n-1]和nums[0]
算法步骤:
- 初始化最大差值变量
- 遍历数组,计算每对相邻元素的绝对差值
- 特别处理最后一个元素与第一个元素的差值(循环特性)
- 返回找到的最大差值
优化思路: 由于题目约束较小(数组长度最多100),一次遍历即可解决,时间复杂度为O(n)。我们可以在一个循环中处理所有情况,包括循环边界。
代码实现
class Solution {
public:
int maxAdjacentDistance(vector<int>& nums) {
int n = nums.size();
int maxDiff = 0;
// 检查所有相邻元素对,包括循环边界
for (int i = 0; i < n; i++) {
int next = (i + 1) % n;
maxDiff = max(maxDiff, abs(nums[i] - nums[next]));
}
return maxDiff;
}
};
class Solution:
def maxAdjacentDistance(self, nums: List[int]) -> int:
n = len(nums)
max_diff = 0
# 检查所有相邻元素对,包括循环边界
for i in range(n):
next_idx = (i + 1) % n
max_diff = max(max_diff, abs(nums[i] - nums[next_idx]))
return max_diff
public class Solution {
public int MaxAdjacentDistance(int[] nums) {
int n = nums.Length;
int maxDiff = 0;
// 检查所有相邻元素对,包括循环边界
for (int i = 0; i < n; i++) {
int next = (i + 1) % n;
maxDiff = Math.Max(maxDiff, Math.Abs(nums[i] - nums[next]));
}
return maxDiff;
}
}
/**
* @param {number[]} nums
* @return {number}
*/
var maxAdjacentDistance = function(nums) {
const n = nums.length;
let maxDiff = 0;
// 检查所有相邻元素对,包括循环边界
for (let i = 0; i < n; i++) {
const next = (i + 1) % n;
maxDiff = Math.max(maxDiff, Math.abs(nums[i] - nums[next]));
}
return maxDiff;
};
复杂度分析
| 复杂度类型 | 值 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历数组一次,检查所有相邻元素对 |
| 空间复杂度 | O(1) | 只使用常数级别的额外空间存储变量 |