LeetCode 每日一题笔记
0. 前言
- 日期:2026.05.29
- 题目:3300. 最小元素
- 难度:简单
- 标签:数组、数学
1. 题目理解
问题描述 :
给定一个整数数组 nums,将数组中每个元素替换为它的各位数字之和 ,返回替换后的数组中的最小值。
示例:
输入:nums = 10,12,13
输出:1
解释:各位和分别为 1、3、4,最小值是 1。
2. 解题思路
核心观察
- 求数字的各位和有两种方式:字符串遍历、数学取模运算。
- 数学法效率更高,无需字符串转换,减少开销。
算法步骤
- 遍历数组所有元素。
- 对每个数字,循环取余累加得到各位和。
- 记录最小的各位和。
3. 代码实现
java
package lc3300;
public class Solution {
public int minElement(int[] nums) {
int res = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
String s = String.valueOf(nums[i]);
int curRes = 0;
for (int j = 0; j < s.length(); j++) {
int num = s.charAt(j) - '0';
curRes += num;
}
res = Math.min(res, curRes);
}
return res;
}
}
4. 代码优化说明
(代码未做任何修改,仅添加注释讲解)
java
class Solution {
public int minElement(int[] nums) {
// 获取数组长度
int len = nums.length;
// 初始化最小值为整型最大值
int min = Integer.MAX_VALUE;
// 遍历数组中的每一个数字
for (int i = 0; i < len; i++) {
int num = nums[i];
// 存储当前数字的各位之和
int temp = 0;
// 循环计算各位和:取最后一位累加,然后移除最后一位
while (num > 0) {
temp += num % 10;
num /= 10;
}
// 更新最小值
min = Math.min(min, temp);
}
return min;
}
}
5. 复杂度分析
- 时间复杂度 :O(n×d)O(n \times d)O(n×d)
n 为数组长度,d 为数字最大位数,整体接近线性复杂度。 - 空间复杂度 :O(1)O(1)O(1)
仅使用常数级变量,无额外空间。
6. 总结
- 核心:数学取模求各位和,比字符串方式更高效。
- 优化点:去掉字符串转换操作,纯数值运算提升性能。
- 关键技巧:
num % 10取最后一位,num /= 10去掉最后一位。