题解 | # java 加起来和为目标值的组合#

加起来和为目标值的组合

http://www.nowcoder.com/practice/172e6420abf84c11840ed6b36a48f8cd

回溯,nums排序后,当sum+nums[i]>target时提前结束递归。



public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param target int整型 
     * @param nums int整型一维数组 
     * @return int整型ArrayList<ArrayList<>>
     */
    ArrayList<ArrayList<Integer>> ans=new ArrayList<>();//保存结果
    Deque<Integer> path=new LinkedList<>();//保存单条路径答案
    
    public void helper(int target,int[] nums,int sum,int start){
        if(target==sum){
            ans.add(new ArrayList<>(path));
            return ;
        }
        
        for(int i=start;i<nums.length;i++){
            //剪枝,结果和已经大于目标值,无需下一轮递归
            if(sum+nums[i]>target) break;
            
            path.addLast(nums[i]);
            sum=sum+nums[i];
            helper(target,nums,sum,i);
            sum=sum-nums[i];//回溯
            path.removeLast();//回溯
        }
    }
    
    public ArrayList<ArrayList<Integer>> combinationCount (int target, int[] nums) {
        // write code here
        if(nums.length==0) return ans;
        Arrays.sort(nums);//排序后便于剪枝
        
        helper(target,nums,0,0);
        return ans;
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
11-19 18:44
已编辑
成都理工大学 Java
程序员花海:我面试过100+校招生,大厂后端面试不看ACM,竞赛经历含金量低于你有几份大厂实习 这个简历整体来看不错 可以海投
如何写一份好简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务