Easy
题目描述
给你一个整数数组 nums。
返回最小的下标 i,使得 nums[i] 的数字之和等于 i。
如果不存在这样的下标,返回 -1。
示例 1:
输入:nums = [1,3,2]
输出:2
解释:
对于 nums[2] = 2,数字之和是 2,等于下标 i = 2。因此,输出是 2。
示例 2:
输入:nums = [1,10,11]
输出:1
解释:
对于 nums[1] = 10,数字之和是 1 + 0 = 1,等于下标 i = 1。
对于 nums[2] = 11,数字之和是 1 + 1 = 2,等于下标 i = 2。
由于下标 1 是最小的,输出是 1。
示例 3:
输入:nums = [1,2,3]
输出:-1
解释:
由于没有下标满足条件,输出是 -1。
提示:
1 <= nums.length <= 1000 <= nums[i] <= 1000
解题思路
这是一道简单的模拟题,我们需要找到最小的下标 i,使得 nums[i] 的各位数字之和等于 i。
解题思路:
- 遍历数组:从下标 0 开始遍历数组中的每个元素
- 计算数字和:对于每个
nums[i],计算其各位数字之和 - 条件判断:如果数字和等于当前下标
i,直接返回i - 返回结果:如果遍历完所有元素都没有找到满足条件的下标,返回 -1
数字和计算方法:
- 通过不断取模 10 获得个位数字,然后整除 10 去掉个位数字
- 重复此过程直到数字变为 0
由于数组长度最大为 100,且数字最大为 1000,时间复杂度很低,直接模拟即可。这是最直观也是最优的解法。
代码实现
class Solution {
public:
int smallestIndex(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) {
int digitSum = 0;
int num = nums[i];
while (num > 0) {
digitSum += num % 10;
num /= 10;
}
if (digitSum == i) {
return i;
}
}
return -1;
}
};
class Solution:
def smallestIndex(self, nums: List[int]) -> int:
for i in range(len(nums)):
digit_sum = 0
num = nums[i]
while num > 0:
digit_sum += num % 10
num //= 10
if digit_sum == i:
return i
return -1
public class Solution {
public int SmallestIndex(int[] nums) {
for (int i = 0; i < nums.Length; i++) {
int digitSum = 0;
int num = nums[i];
while (num > 0) {
digitSum += num % 10;
num /= 10;
}
if (digitSum == i) {
return i;
}
}
return -1;
}
}
/**
* @param {number[]} nums
* @return {number}
*/
var smallestIndex = function(nums) {
for (let i = 0; i < nums.length; i++) {
let digitSum = nums[i].toString().split('').reduce((sum, digit) => sum + parseInt(digit), 0);
if (digitSum === i) {
return i;
}
}
return -1;
};
复杂度分析
| 复杂度 | 分析 |
|---|---|
| 时间复杂度 | O(n × log m),其中 n 是数组长度,m 是数组中元素的最大值。对于每个元素,计算数字和需要 O(log m) 时间 |
| 空间复杂度 | O(1),只使用了常数额外空间 |