字节面试题-小于N的最大数字

该题目在网上目前的答案很多,但是要么很长难以理解,要么答案根本就不对。最近看到了这位博主的博文:字节面试题:给定数字n,数组arr={1,3,5,2},求arr中的数字能组成小于n的最大整数_斯文流氓骚刚的博客-CSDN博客

深受启发,但原文仍有瑕疵,最终的答案可以等于N,而且有不必要的搜索。本文作了修改,使用python语言重写。

题目要求:给定一个数组arr=[2,3,4,5],N=2345,求使用arr中的数字,组成一个不大于N的最大的数字。arr中的数字可以多次使用。

思路:

首先将arr数组排序,之后使用深搜+贪心的思想,从第一位开始,尽量使用与对应位置相等的数字。如果有任意一位没有使用相等的数字,那在后面的所有位中都直接使用最大的数字即可。

递归终止条件:

        1.已经考虑完了所有的位,那么应该返回0

        2.在之前选择的基础上,此位置没有满足条件的选择,应当返回-1

边界情况:

        1.如果前面都是用了相等的数字,那么最后一位选用的数字必须小于对应的数字。

        2.如果在找第一位时,就发现都不相等,那不要立刻返回-1,而是应该放弃第一位,将后面的位都选择最大值。

代码如下:

from typing import List
"""
arr:可使用数字的数组
nums:目标数字对应的整数数组
preEq:之前是否每一位都使用了相等的值
index:当前考虑到了第几位,从0开始
函数语义:返回第index位后可组成的最大的数字,包括第index位
"""
def dfs(arr, nums,  preEq,  index):
    #如果考虑完了最后一位,那么能组成的最大值为0
    if ind
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值