两数之和及其变体

文章提供了解决编程问题的两种Java方法,目标是找到所有可以组成给定目标数但不包含数组(雷点)中的数字的组合。方法一是通过哈希集存储数组元素并检查目标数的补数是否存在;方法二是直接在哈希集中添加(t,s-t)对来简化处理。
摘要由CSDN通过智能技术生成

lc第一题 两数之和

科大讯飞2023.7.29笔试

现在给定一个目标数target,一个数组arr,数组表示雷点,即组成target的两个数x,y不能出现在这个数组中,请求出有多少种方案组成target?

数据范围:
-10^9 <= target, arr[i]<=10^9
1<=x,y<=target

例子:
输入:target=10,arr=[1,2,3]
结果:3

方法一:

import java.util.HashSet;
import java.util.Set;

public class XunFei {

    public static void main(String[] args) {
        int[]a=new int[]{1,2,3,4,6};
        System.out.println(getVal(a,10));
    }

    public static int getVal(int[]arr,int t){
        int cnt=0;
        Set<Integer> s=new HashSet<>();
        int total=arr.length;
        
        for(int i=0;i<arr.length;i++){
     
            if(arr[i]>=t){
                total--;
                continue;
            }
            s.add(arr[i]);
            if(s.contains(t-arr[i])){
                cnt++;
            }

        }

        return t-1-cnt*2-(total-cnt*2)*2;
    }
}

方法二:(简约版本)

  import java.util.*;
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int[] a = new int[n];
            Set<Integer> st = new HashSet<>();
            for(int i = 0 ; i < n ; i ++) {
                a[i] = sc.nextInt();
            }
            int s = sc.nextInt();
            for(int t: a) {
                if(t < s) {
                    st.add(t); #相当于在set中添加(t, s-t)对
                    st.add(s-t); #相当于添加(s-t, t)}
            }
            System.out.println(s - 1 - st.size());
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值