牛客刷题 数组求和

本文总结了在LeetCode和牛客网上遇到的数组求和题目,包括寻找数组中和为目标值的两个整数的下标、找到和为S且乘积最小的两个数以及找出所有和为S的连续正数序列。通过解题思路的分享,帮助读者理解这类问题的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在leetcode上刷到第一题,又在牛客上刷到与第一题相似的第二、第三题,整理如下:

第一题:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

解题思路:

public class Solution{
	public static void main(String args[]){

		int [] nums = {2, 7, 11, 15};
		int target=9;
		Solution s = new Solution();
		s.twoSum(nums, target);
	}
	public int[] twoSum(int[] nums, int target) {
		int i,j = 0;
        for(i=0;i<nums.length-1 ;i++){
        	for(j=i+1;j<nums.length;j++){
        		if(nums[i]+nums[j]==target){
        			System.out.println(i);
        			System.out.println(j);
        			int[] a = {i,j};
        			return a;
        		}
        	}
        }
		return null; 
	}
}

题目二:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。对应每个测试案例,输出两个数,小的先输出。

解题思路:

public class Solution{
	public static void main(String args[]){
		int[] array={1,2,3,4,5,6,7};
		int sum =8;
		Solution s= new Solution();
		s.FindNumbersWithSum(array, sum);
	}
	public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
		ArrayList  list=new  ArrayList();
		
		int min = 0;
		int max = array.length -1;
		int a1 = 0 ;
		int a2 =0;
		
		int chen=0;
		for(int i=0;min<max;i++){
			if(array[min]+array[max]>sum) max--;
			if(array[min]+array[max]<sum) min++;
			if(array[min]+array[max]==sum){
				System.out.println(array[min]+"和"+array[max]);
					if(chen==0||array[min]*array[max]<chen)
					{
						a1 =array[min];
						a2 =array[max];
						chen=array[min]*array[max];
					}
				max--;
				min++;
			}
		}
		if(a1==0&&a2==0) return null;
		list.add(a1);
		list.add(a2);
		
		return list;
    }
}

题目三:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

解题思路:

public class Solution{
	public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum){
		ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
		int min = 1;
		int max = 2;
		while(max<sum){
			if((min+max)*(max-min+1)/2<sum){
				max+=1;
			}
			else if((min+max)*(max-min+1)/2==sum){
				ArrayList<Integer> arr = new ArrayList<Integer>();
				for(int i=min;i<=max;i++){
					arr.add(i);
				}
				list.add(arr);
				min+=1;
				max+=1;
			}
			if((min+max)*(max-min+1)/2>sum){
				min+=1;
			}
		}
		return list;   
    }
}

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值