标签:count opt 996 return 17 Arrays res Number int
问题:
给定一组数,将其排列
使得相邻两个数的和,正好是一个可被平方的数。
求所有的排列可能个数。
Example 1: Input: [1,17,8] Output: 2 Explanation: [1,8,17] and [17,8,1] are the valid permutations. Example 2: Input: [2,2,2] Output: 1 Note: 1 <= A.length <= 12 0 <= A[i] <= 1e9
解法:Backtracking(回溯算法)
- 状态:到目前为止,排列好的数列。(余下几个数left,当前选择的数x)
- 选择:以当前选择的数 为标准,下一个能与他之和满足条件,成为平方数的,所有可能数。
- ⚠️ 注意:若数列中存在重复的数字,那么当前为止该数字只能选择一次,作为一个排列。
- 递归退出条件:
- left==0,所有数用完,找到一个满足条件的解,res++,return
- 尝试完所有可能,未找到,return
对于本问题:
- 求排列:避免重复元素->使用set:count对不同元素,进行计数。
- 每次递归,用掉一个数,count[x]--
- 递归结束,恢复count[x]++
- 构造每个元素,下一个可选的所有数:使用map:opt:
- key=当前元素x,value={ 可选元素1,可选元素2...... } y
- 这些可选元素满足:sqrt(x+y)^2 = x+y
♻️
标签:count,opt,996,return,17,Arrays,res,Number,int 来源: https://www.cnblogs.com/habibah-chang/p/14345671.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。