【华为OD题库-053】符合要求的元组个数/k数之和-java

题目

给定一个整数数组nums、一个数字k,一个整数目标值target,请问nums中是否存在k个元素使得其相加结果为target,请输出所有符合条件且不重复的k元组的个数
数据范围

2<= nums.length <= 200

-10^9 < nums[i] < 10^9

-10^9 < target < 10^9

2<=k<=100
输入描述

第一行是nums取值:2 7 11 15

第二行是k的取值:2

第三行是target取值: 9
输出描述

输出第一行是符合要求的元组个数: 1

补充说明:

[2,7]满足,输出个数是1
示例1:
输入

-1 0 1 2 -1 -4

3

0
输出

2
说明

[-1,0,1],[-1,-1,2]满足条件

思路

组合题,直接用套路:【JAVA-排列组合】一个套路速解排列组合题

题目不要求具体组合,所以path可以省略

注意剪枝条件:

同层相同剪枝 -- 排除重复数据

将nums按照从小到大排序,如果当前值大于0,后面一定大于0,如果此时累加和已经大于等于初始目标(两者差值<=0),那么后续加一个更大的数,肯定不满足,直接break

题解

java 复制代码
package hwod;

import java.util.Arrays;
import java.util.Scanner;

public class KNumsSum {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int k = Integer.parseInt(sc.nextLine());
        int target = Integer.parseInt(sc.nextLine());
        System.out.println(kNumSum(nums, k, target));
    }

    private static int res;

    private static int kNumSum(int[] nums, int k, int target) {
        Arrays.sort(nums);
        int[] used = new int[nums.length];
        dfs(nums, 0, used, k, target);
        return res;
    }

    private static void dfs(int[] nums, int start, int[] used, int k, int target) {
        if (k == 0) {
            if (target == 0) res++;
            return;
        }
        for (int i = start; i < nums.length; i++) {
            if (nums[i] > 0 && target <= 0) break; //当前值都大于0,后面一定大于0,如果此时累加和已经大于等于初始目标,那么后续加一个更大的数,肯定不满足,直接break
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0) continue;//同层相同剪枝
            used[i] = 1;
            dfs(nums, i + 1, used, k - 1, target - nums[i]);
            used[i] = 0;
        }
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

相关推荐
Q_19284999065 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟22 分钟前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S33 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos40 分钟前
C++----------函数的调用机制
java·c++·算法
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc1 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
Yuan_o_1 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Oneforlove_twoforjob1 小时前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言