一、题目描述
二、解题思路
这里首先要分辨清楚是子序列还是子数组
原数组:[1,2,3,4,5]
子序列:元素和元素之间相对位置保持不变,但是在原数组中不一定连续,如:[1,3,4];
子数组:元素元素之间保持原数组的连续关系,如:[1,2,3];
问题中问的是子序列:
所以我们这边可以使用回溯法,在回溯过程中判断是否存在子序列和为7的倍数(相当于穷举了所有情况)。
设置一个标记数组hasUsed,用于判断当前元素是否被使用过,如果没有使用过纳入子序列范围计算和,然后做出判断,直到所有的子序列都尝试过。
三、代码实现
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int findRainbow (int[] nums) {
// write code here
//初始化hasUsed数组
boolean[] hasUsed = new boolean[nums.length];
for(int i=0;i<nums.length;i++){
hasUsed[i]=false;
}
return recursiveFunc(nums,hasUsed,0)?1:0;
}
//注意:这里是子序列,并不是子数组,不能直接通过双层for循环来实现
//通过回溯法进行查找
public boolean recursiveFunc(int[] nums,boolean[] hasUsed,int nowSum){
boolean resbool=false;//如果没找到则默认返回false
if(nowSum!=0&&nowSum%7==0){
resbool=true;
}else{
for(int i=0;i<nums.length;i++){
if(!hasUsed[i]){
nowSum+=nums[i];
hasUsed[i]=true;
if(recursiveFunc(nums,hasUsed,nowSum)){
resbool=true;
break;
}else{
//这里注意,把未满足情况的当前元素要从nowSum中删除
nowSum-=nums[i];
hasUsed[i]=false;
}
}
}
}
return resbool;
}
}
四、测试用例问题
在提交测试中:这个测试用例没有通过,这个测试用例应该是返回1,在提交以后注意一下。
五、刷题链接
牛牛的彩虹数组_牛客题霸_牛客网