leetcode 3903. 最小稳定下标 I 简单
2026/9/5 2:33:26 网站建设 项目流程

给你一个长度为n的整数数组nums和一个整数k

对于每个下标i,定义它的不稳定值max(nums[0..i - 1]) - min(nums[i..n - 1])

换句话说:

  • max(nums[0..i - 1])表示从下标 0 到下标i - 1的元素中的最大值
  • min(nums[i..n - 1])表示从下标i到下标n - 1的元素中的最小值

如果某个下标i的不稳定值小于等于k,则称该下标为稳定下标

返回最小的稳定下标。如果不存在这样的下标,则返回-1

示例 1:

输入:nums = [5,0,1,4], k = 3

输出:3

解释:

  • 在下标 0 处:[5]中的最大值是 5,[5, 0, 1, 4]中的最小值是 0,因此不稳定值为5 - 0 = 5
  • 在下标 1 处:[5, 0]中的最大值是 5,[0, 1, 4]中的最小值是 0,因此不稳定值为5 - 0 = 5
  • 在下标 2 处:[5, 0, 1]中的最大值是 5,[1, 4]中的最小值是 1,因此不稳定值为5 - 1 = 4
  • 在下标 3 处:[5, 0, 1, 4]中的最大值是 5,[4]中的最小值是 4,因此不稳定值为5 - 4 = 1
  • 这是第一个不稳定值小于等于k = 3的下标,因此答案是 3。

示例 2:

输入:nums = [3,2,1], k = 1

输出:-1

解释:

  • 在下标 0 处,不稳定值为3 - 1 = 2
  • 在下标 1 处,不稳定值为3 - 1 = 2
  • 在下标 2 处,不稳定值为3 - 1 = 2
  • 这些值都不小于等于k = 1,因此答案是-1

示例 3:

输入:nums = [0], k = 0

输出:0

解释:

在下标 0 处,不稳定值为0 - 0 = 0,它小于等于k = 0。因此答案是 0。

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 10^9
  • 0 <= k <= 10^9

分析:先分别求出最大值和最小值数组,再从小到大遍历所有下标,检查是否存在一个下标的不稳定值小于等于 k 即可。

int firstStableIndex(int* nums, int numsSize, int k) { int cnt_max[numsSize],cnt_min[numsSize]; for(int i=0,j=numsSize-1;i<numsSize;++i,--j) { if(i==0)cnt_max[i]=nums[i],cnt_min[j]=nums[j]; else cnt_max[i]=fmax(cnt_max[i-1],nums[i]),cnt_min[j]=fmin(cnt_min[j+1],nums[j]); } for(int i=0;i<numsSize;++i) if(cnt_max[i]-cnt_min[i]<=k)return i; return -1; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询