数组-检查数组内是否存在和为7的倍数的子序列

一、题目描述

二、解题思路

这里首先要分辨清楚是子序列还是子数组

        原数组:[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,在提交以后注意一下。

五、刷题链接

牛牛的彩虹数组_牛客题霸_牛客网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值