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 <= 100
  • 0 <= nums[i] <= 1000

解题思路

这是一道简单的模拟题,我们需要找到最小的下标 i,使得 nums[i] 的各位数字之和等于 i

解题思路:

  1. 遍历数组:从下标 0 开始遍历数组中的每个元素
  2. 计算数字和:对于每个 nums[i],计算其各位数字之和
  3. 条件判断:如果数字和等于当前下标 i,直接返回 i
  4. 返回结果:如果遍历完所有元素都没有找到满足条件的下标,返回 -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),只使用了常数额外空间