Algo_dfs、技巧_TODO
作者:互联网
给定n个长度为m的一维数组, 问你是否可以找到一个长度为m的ans一维数组
这n个一维数组A[1,2,3…,n],每个都可以在修改<=2个元素后,变成ans
如果可以,输出这个数组ans; 否则输出No
n * m = 1e6, 这n*m个元素 = 【1, 1e9】
1 2 3 4 5 当我们的ans选择 = [1, 2, 1, 2, 5]后
3 4 1 2 5 A[1] A[2] A[3],都可以在修改<=2元素后,变成ans
1 2 6 7 5
1, n*m的范围很大1e6, 而且数值是[1, 1e9] 也很大
直接暴力肯定是不行的。
2, 但也没有适合的其他方法,貌似只有暴力 这一种做法。
其实很难想到,这个数据规模,居然是可以使用暴力dfs的.....
当然,很很重要的一点是: 这个问题,确实没有其他优秀的做法,我们就应该往暴力dfs去想
3, 暴力,你肯定第一直觉是想到: 直接对ans暴力dfs
这肯定是错误的,因为 数据范围这么大,你要暴力到什么时候...
I: 很很重要的一点, 如果存在ans的话,ans一定是和A[1] 只有<=2个元素不同。
能想到这一点,是非常非常重要的!!! 说明,你的思维 是非常有跳跃性的~~~
' 此时,ans变为(ans枚举所有: 与A[1]只有<=2个不同元素) * n (检查) '
即: ( 1 + C[m, 1] + C[m, 2] ) * n )
这当然也是超时的, 但已经比你直接暴力 要优化的多。
II: 此时,我们当然需要继续的优化。
如何优化呢? (还是要从: A[1]入手)
但不要再关注,A[1]与ans的关系,因为 我们已经分析过了,这确实是超时的
而是,我们以A[1]为base,去遍历所有A[2,3,4...n]
' 即问题转变为: 依次比较A[1] 与 A[2,3,4...n] 的不同元素的个数 '
' 令这n-1个数为diff[2,3,..,n], diff[5]表示: A[1]与A[5]不同元素的个数
1, 假如说,diff[2,3,4...n]都是 <= 2的
那么,我们的ans 就选择A[1]即可!!! (这一点,也非常重要!!!)
2, 只要存在一个diff是 >= 5的,则一定无解!!
比如: A[1] = [1, 2, 3, 4, 5, 6, 6]
A[i] = [2, 3, 4, 5, 6, 6, 6] (有5个是不同的)
标签:一维,暴力,dfs,Algo,数组,ans,1e9,TODO 来源: https://blog.csdn.net/weixin_42712593/article/details/115336949