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

相关推荐
蛋蛋的就会顺顺的5 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8266 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡6 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
伯恩bourne8 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_8 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs9 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲9 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户21296835261689 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
helmsail10 小时前
05 管理活动与选品
java