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

相关推荐
2601_963870201 小时前
【计算机毕业设计】基于Spring Boot的专科医院医疗管理系统
java·spring boot·课程设计
Bingo_BIG1 小时前
Java Spring 批量修改,实体、接口、方法的定义
java·spring
画中有画2 小时前
软件架构中质量属性(性能、安全、可扩展性)的权衡设计
java·运维·安全
Shaoxi Zhang2 小时前
JAVA学习笔记035——对象和JSON格式
java·笔记·学习
赵丙双2 小时前
CountDownLatch 源码分析
java·aqs·countdownlatch
余额瞒着我当琳2 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
thefool1122663 小时前
翻转二叉树
java
喜欢打篮球的普通人3 小时前
LLVM Backend Lowering 从入门到实战:把 IR 变成机器码的完整链路
android·java·数据库
FL16238631294 小时前
室内易燃物识别易燃评估室内易燃程度识别分割数据集labelme格式1015张85类别
java·服务器·前端
jufeng13074 小时前
【系列:TDengine 工业物联网实战:从零搭起可运行系统 · 第 8 篇】
java·spring boot·时序数据库·tdengine