力扣2094题解

力扣2094题暴力遍历解法

记录:

2025.5.12

题目:

在这里插入图片描述

思路:

暴力遍历。

解题步骤:

1.统计数字出现次数:使用数组cnt来记录输入数组中每个数字的出现次数。
2.生成三位偶数:通过循环从100开始,每次递增2,生成所有三位偶数。
3.检查有效性:对于每个生成的三位偶数,分解其每一位数字,并统计每个数字的使用次数。如果任何一个数字的使用次数超过原数组中的次数,则跳过该数;否则将其加入结果列表。
4.返回结果:将结果列表转换为数组并返回。

代码:

class Solution {
    public int[] findEvenNumbers(int[] digits) {
        int[] cnt = new int[10];
        for (int d : digits) {
            cnt[d]++;
        }

        List<Integer> ans = new ArrayList<>();
        next:
        for (int i = 100; i < 1000; i += 2) { 
            int[] c = new int[10];
            for (int x = i; x > 0; x /= 10) { 
                int d = x % 10;
                if (++c[d] > cnt[d]) { 
                    continue next; 
                }
            }
            ans.add(i);
        }
        return ans.stream().mapToInt(i -> i).toArray();
    }
}



复杂度:

O(N∗Log10(N))
O(1)

力扣基础题目涉及多种类型,不同类型有不同的解题方法: - **动态规划**:这是一种解决多阶段决策问题的方法,通过保存子问题的解来避免重复计算,常用于路径规划、背包问题等。例如对于“不同路径”问题,使用动态规划解题步骤如下:确定`dp`数组下标含义,递推公式,初始化,遍历顺序,最后推导结果。以`uniquePaths`函数为例,代码如下: ```java class Solution { public int uniquePaths(int m, int n) { int[][] dp = new int[m][n]; for(int i = 0; i < m; ++i){ dp[i][0] = 1; } for(int i = 0; i < n; ++i){ dp[0][i] = 1; } for(int i = 1; i < m; ++i){ for(int j = 1; j < n; ++j){ dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } return dp[m - 1][n - 1]; } } ``` - **数据库类题目**:解题时需读懂题目意思,以特定的需求构建 SQL 查询语句。例如对于相关数据库题目,需要保证容量大于相同分数的人数的同时,选择最低的分数,代码如下: ```sql select school_id,ifnull(min(score),-1) from Schools s left join Exam e on s.capacity >= student_count group by school_id; ``` - **Python 基础算法题**:根据题目要求对输入数据进行处理和计算。例如处理输入的两个数组`nums1`和`nums2`,根据数组长度的奇偶性计算结果,代码如下: ```python nums1 = list(map(int, input('nums1=').split())) nums2 = list(map(int, input('nums2=').split())) m, n = len(nums1), len(nums2) if (m + n) % 2 == 1: k = (m + n) // 2 + 1 elif (m + n) % 2 == 0: k = (m + n) // 2 while k > 1: kk = k // 2 - 1 if nums1[kk] <= nums2[kk]: nums1 = nums1[kk + 1:] else: nums2 = nums2[kk + 1:] k -= k // 2 if (m + n) % 2 == 1: print(min(nums1[0], nums2[0])) elif (m + n) % 2 == 0: print((nums1[0] + nums2[0]) / 2) ``` 此外,还有其他常见解题方法,如广度优先搜索用于图的遍历;深度优先搜索用于遍历图或求解迷宫问题;贪心算法每一步选择当前最优决策;双指针用于在数组或字符串中遍历;滑动窗口在数组或字符串上滑动固定大小窗口进行计算或查找;回溯用于解决组合、排列问题;分治将问题分解为子问题分别求解再合并;快速选择用于在未排序数组中找第 k 小元素;排序算法有冒泡排序、快速排序、归并排序等;计数排序适用于一定范围内的整数排序 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值