其他分享
首页 > 其他分享> > Algo_dfs、技巧_TODO

Algo_dfs、技巧_TODO

作者:互联网

LINK

给定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