Easy
题目描述
给你一个整数数组 nums。
你需要将 nums 中的每个元素替换为其各位数字之和。
返回所有替换操作完成后 nums 中的最小元素。
示例 1:
输入:nums = [10,12,13,14]
输出:1
解释:
所有替换操作完成后,nums 变为 [1, 3, 4, 5],最小元素为 1。
示例 2:
输入:nums = [1,2,3,4]
输出:1
解释:
所有替换操作完成后,nums 变为 [1, 2, 3, 4],最小元素为 1。
示例 3:
输入:nums = [999,19,199]
输出:10
解释:
所有替换操作完成后,nums 变为 [27, 10, 19],最小元素为 10。
约束条件:
1 <= nums.length <= 1001 <= nums[i] <= 10^4
提示:
- 将数字转换为字符串并计算每个元素的各位数字之和。
解题思路
解题思路
这道题的核心是计算每个数字的各位数字之和,然后找出最小值。
主要步骤:
计算各位数字之和:对于每个数字,我们需要提取其每一位数字并求和
- 方法1:转换为字符串,遍历每个字符
- 方法2:使用数学运算,不断取模和整除
找最小值:在所有转换后的数字中找到最小值
算法实现:
对于计算各位数字之和,推荐使用数学方法:
- 使用
num % 10获取最后一位数字 - 使用
num /= 10去掉最后一位 - 重复直到数字为0
时间复杂度分析:
- 对于每个数字,计算各位数字之和的时间复杂度为 O(log num)
- 总时间复杂度为 O(n × log max(nums))
这种方法简洁高效,避免了字符串转换的开销。
代码实现
class Solution {
public:
int minElement(vector<int>& nums) {
int minVal = INT_MAX;
for (int num : nums) {
int digitSum = 0;
while (num > 0) {
digitSum += num % 10;
num /= 10;
}
minVal = min(minVal, digitSum);
}
return minVal;
}
};
class Solution:
def minElement(self, nums: List[int]) -> int:
def digit_sum(num):
total = 0
while num > 0:
total += num % 10
num //= 10
return total
return min(digit_sum(num) for num in nums)
public class Solution {
public int MinElement(int[] nums) {
int minVal = int.MaxValue;
foreach (int num in nums) {
int digitSum = 0;
int temp = num;
while (temp > 0) {
digitSum += temp % 10;
temp /= 10;
}
minVal = Math.Min(minVal, digitSum);
}
return minVal;
}
}
var minElement = function(nums) {
function digitSum(num) {
let sum = 0;
while (num > 0) {
sum += num % 10;
num = Math.floor(num / 10);
}
return sum;
}
return Math.min(...nums.map(digitSum));
};
复杂度分析
| 复杂度类型 | 复杂度 |
|---|---|
| 时间复杂度 | O(n × log(max(nums))) |
| 空间复杂度 | O(1) |
其中 n 是数组长度,log(max(nums)) 是最大数字的位数。