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

题目

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

2<= nums.length <= 200

-10^9 < numsi < 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),查看当前专栏更新的所有题目。

相关推荐
IKUN家族7 小时前
Spring MVC(一)
java·spring·mvc
老马识途2.09 小时前
关于跨域问题的总结
java·前端
都叫我大帅哥9 小时前
Java日期时间三十年战争:从Date考古到LocalDateTime革命,以及数据库与前端的那点事儿
java
Muscleheng10 小时前
SpringBoot 集成 DeepSeek 实现 RAG 文档问答
java·spring boot·ai·springai
2501_9364156910 小时前
可变参数&综合练习&斗地主游戏
java·windows·游戏
极客先躯11 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
xqqxqxxq12 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
wang090712 小时前
自己动手写一个spring之aop_1
java·后端·spring
国科安芯13 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
deng120413 小时前
【Thread类的用法(1)-- Thread类的基本用法】
java·java-ee