【华为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),查看当前专栏更新的所有题目。

相关推荐
一只大袋鼠几秒前
JavaWeb四种文件上传方式(下篇)
java·开发语言·springmvc·javaweb
TE-茶叶蛋32 分钟前
深入研究 yudao-framework 模块:Java 编程能力提升指南
java·开发语言
逻辑驱动的ken40 分钟前
Java高频考点场景题24
java·开发语言·面试·职场和发展·求职招聘
兔小盈1 小时前
多线程-(五)线程安全之内存可见性
java·开发语言·多线程
CeshirenTester1 小时前
LangChain的工具调用 vs 原生Skill API:性能差在哪儿?
java·人工智能·langchain
yaoxin5211231 小时前
400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件
java·开发语言·python
Fox爱分享1 小时前
字节二面:10亿数据毫秒级查手机尾号后4位,答不出“异构索引”直接挂?
java·后端·面试
6190083362 小时前
win idea 控制台中文乱码
java·ide·intellij-idea
折哥的程序人生 · 物流技术专研2 小时前
《Java面试85题图解版(二)》进阶深化上篇:并发编程 + JVM
java·开发语言·后端·面试
abcnull2 小时前
用ASM做精准测试(Java)
java·jar·asm·字节码·精准测试