42、和为S的两个数字

一、题目

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

二、解法

 1 import java.util.ArrayList;
 2 public class Solution {
 3     public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
 4         ArrayList<Integer> al = new ArrayList<>();
 5         int i = 0;//前面的指针
 6         int j = array.length-1;//后面的指针
 7         if(array == null || array.length <2)
 8             return al;
 9         //通过不断移动指针,i,j距离相差越大,则乘机越小
10         while(i < j){
11             if(array[i] + array[j] == sum){
12                 al.add(array[i]);
13                 al.add(array[j]);
14                 return al;
15             }else if(array[i] + array[j] > sum){
16                 j--;
17             }else{
18                 i++;
19             }
20         }
21         return al;
22     }
23 }
时间: 2024-12-17 07:06:14

42、和为S的两个数字的相关文章

剑指offer 42.和为S的两个数字

剑指offer 42.和为S的两个数字 题目 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 思路 同样是滑动窗口题目,设置左右两个游标,然后计算和,若和小,那么左侧游标增加,区间和大,右侧游标减小,保存结果的时候要比较一下更符合条件的数. 代码 public ArrayList<Integer> FindNumbersWithSum(int[]

42.和为S的两个数字(python)

题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 方法一:两层for循环,得到的就是乘积最小的 1 class Solution: 2 def FindNumbersWithSum(self, array, tsum): 3 # write code here 4 for i in range(0,len(array)-1): 5 for j in r

和为S的两个数字VS和为S的连续正数序列

题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. 思路:最初我们找到数组的第一个数字和最后一个数字.首先定义两个指针,第一个指针指向数组的第一个(也就是最小的)数字,第二个指针指向数组的最后一个(也就是最大的)数字.当两个数字的和大于输入的数字时,把较大的数字往前移动:当两个数字的和小于数字时,把较小的数字往后移动:当相等时,打完收工.这样扫描的顺序是从数组的两端向数组的中间扫描. #include "stdafx.

输入两个数字,将比较结果输出到页面

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 6 <title>比较两个数字大小</title> 7 <meta name="descripti

数组中只出现一次的两个数字

题目:给定一个整型数组,其中有两个数字只出现一次,其余的数字都出现两次,找出这两个只出现一次的数字.时间复杂度为O(n),空间复杂度为O(1). 异或运算的特性:相等的两个整数异或的结果为0:一个整数与0进行异或运算的结果为其本身. 基本思想:将这两个只出现一次的数字分到两个数组中,这样就很容易找到只出现一次的数字. 采用上述思想需要解决的问题: 1.如何才能保证两个只出现一次的数字分别位于两个数组? 2.空间复杂度为O(1),需要在原数组上进行分割操作,这个如何做到? 解决办法: 1.将数组中

java . 请在小于99999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676。

1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Map.Entry; 4 //请在小于99999的正整数中找符合下列条件的数,它既是完全平方数, 5 //又有两位数字相同,如:144,676. 6 public class wqs { 7 8 //完全平方数 9 public static boolean iswqs(int n){ 10 int i; 11 double dn=Math.sqrt(n)

剑指Offer36 数组所有数字出现两次,只有两个出现了一次,找出这两个数字

1 /************************************************************************* 2 > File Name: 38_NumbersAppearOnce.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月03日 星期六 10时50分32秒 6 *******************************

添加两个数字(Leetcode)

问题: 给定两个非空的链表,表示两个非负整数.数字以相反的顺序存储,每个节点包含一个数字.添加两个数字并将其作为链表返回. 您可以假设两个数字不包含任何前导零,除了数字0本身. 输入:(2 - > 4 - > 3)+(5 - > 6 - > 4)输出: 7 - > 0 - > 8 代码: 1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * Li

C语言:一个数组中只有两个数字是出现一次

1 //1.一个数组中只有两个数字是出现一次, 2 //其他所有数字都出现了两次. 3 //找出这两个数字,编程实现.a 4 5 //^=单独两个数的^结果 6 //单独出现的两个数不同位的标记 7 //position: ^结果中第一个出现1的位置 8 //position位两个数肯定有一个为0 ,一个为1 9 //把数组分成两部分 10 //1:position为1 11 //2:position为0 12 //每一部分都有一个只出现一次的数字,其他的都是成对出现 13 //每一部分^结果为

Java交换两个数字

一.四种方式交换两个数字 直接交换:失败 包装类交换:失败 数组方式交换:成功 成员变量交换:成功 1 public class SwapNumbers { 2 public int a; 3 public int b; 4 5 //包装类交换 6 public static void swap (Integer a, Integer b) { 7 Integer temp = a; 8 a = b; 9 b = temp; 10 } 11 12 //直接交换 13 public static