寒假冬令营(算法编程)1月5日(枚举)

文章介绍了如何使用二分查找算法在排序数组中找到目标值的插入位置,同时给出了一个Java实现。接着讨论了如何找出仅由给定数组中三个不同元素组成的3位偶数,通过枚举并检查数字出现次数来优化效率。
摘要由CSDN通过智能技术生成

题目描述(1)

35. 搜索插入位置

. - 力扣(LeetCode)

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示:

  • 1 <= nums.length <= 104

  • -104 <= nums[i] <= 104

  • nums无重复元素升序 排列数组

  • -104 <= target <= 104

解题结果

Java

class Solution {
    public int searchInsert(int[] nums, int target) {
        // 给出一个已经从小到大排列的后的数组,要求在数组中找到插入target元素的位置
        int l = nums.length;
        // 使用二分查找
        int left = 0, right = l-1 , ans = l;
        while(left <= right){
            int mid = ((right-left) >> 1) + left;
            if(target <= nums[mid]){
                ans = mid;
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return ans;
    }
}

题目描述(2)

2094. 找出 3 位偶数

. - 力扣(LeetCode)

给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。

你需要找出 所有 满足下述条件且 互不相同 的整数:

  • 该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成。

  • 该整数不含 前导零

  • 该整数是一个 偶数

例如,给定的 digits[1, 2, 3] ,整数 132312 满足上面列出的全部条件。

将找出的所有互不相同的整数按 递增顺序 排列,并以数组形式返回

示例 1:

输入:digits = [2,1,3,0]
输出:[102,120,130,132,210,230,302,310,312,320]
解释:
所有满足题目条件的整数都在输出数组中列出。 
注意,答案数组中不含有 奇数 或带 前导零 的整数。

示例 2:

输入:digits = [2,2,8,8,2]
输出:[222,228,282,288,822,828,882]
解释:
同样的数字(0 - 9)在构造整数时可以重复多次,重复次数最多与其在 digits 中出现的次数一样。 
在这个例子中,数字 8 在构造 288、828 和 882 时都重复了两次。 

示例 3:

输入:digits = [3,7,5]
输出:[]
解释:
使用给定的 digits 无法构造偶数。

提示:

  • 3 <= digits.length <= 100

  • 0 <= digits[i] <= 9

解题结果

Java

  首先通过统计 digits 数组中每个数字的出现次数,然后在一个循环中枚举所有可能的三位数(范围为 100999,步长为 2,因为要找偶数)。对于每个三位数,它会统计各个数字的出现次数,并与 digits 数组中的统计进行比较。如果三位数中的每个数字的出现次数都不超过 digits 数组中对应数字的出现次数,就将该三位数加入结果列表。最后,将结果列表转换为数组并返回。这种方法避免了遍历所有可能的排列组合,而是通过枚举三位数,然后比较数字的出现次数,更加高效。

class Solution {
    public int[] findEvenNumbers(int[] digits) {
        // 创建一个数组来统计每个数字(0 到 9)的出现次数。
        int[] count = new int[10];
        
        // 统计给定 'digits' 数组中每个数字的出现次数。
        for (int d : digits) {
            count[d]++;
        }
        
        // 初始化一个列表来存储结果中的三位数偶数。
        List<Integer> ans = new ArrayList<>();
        
        // 枚举所有介于 100 到 999(含)之间的三位数偶数。
        for (int i = 100; i < 1000; i += 2) {
            // 创建一个临时数组来统计当前三位数中每个数字的出现次数。
            int[] temp = new int[10];
            
            // 从当前数字中提取每个数字,并更新临时计数数组。
            int num = i;
            while (num > 0) {
                temp[num % 10]++;
                num /= 10;
            }
            
            // 检查当前三位数是否满足基于数字出现次数的条件。
            boolean flag = true;
            for (int j = 0; j < 10; j++) {
                if (count[j] < temp[j]) {
                    flag = false;
                    break;
                }
            }
            
            // 如果满足条件,则将当前三位数添加到结果列表中。
            if (flag) {
                ans.add(i);
            }
        }
        
        // 将结果列表转换为数组并返回。
        int[] ansArray = new int[ans.size()];
        for (int i = 0; i < ansArray.length; i++) {
            ansArray[i] = ans.get(i);
        }
        return ansArray;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pedestrians74

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值