首页
学习
活动
专区
圈层
工具
发布

和为S的两个数字

题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。...思想 排好序的情况下 若ai + aj == sum i和j相差越远乘积越小 我们可以定义两个指针,一个从前面走,一个从后面走,如何走由ai + aj和sum关系驱动; 分析: 若ai + aj...== sum 则可以直接返回了,因为,遇到的第一个符合条件的必然是最小的; 若ai + aj > sum 那么只能 j-- 让和降低下次才可能出现ai + aj == sum 若ai + aj...和升高下次才可能出现ai + aj == sum 代码 public ArrayList FindNumbersWithSum(int [] array,

42820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 解题思路 法一:哈希法。...用一个HashMap,它的 key 存储数S与数组中每个数的差,value 存储当前的数字,比较S=15, 当前的数为 4,则往 hashmap 中插入(key=11, value=4)。...我们遍历数组,判断hashmap 中的 key 是否存在当前的数字,如果存在,说明存在着另一个数与当前的数相加和为 S,我们就可以判断它们的乘积是否小于之前的乘积,如果小的话就替换之前的找到的数字,如果大就放弃当前找到的...如果hashmap 中的 key 不存在当前的数字,说明还没有找到相加和为 S 的两个数,那就把S与当前数字的差作为 key,当前数字作为 value 插入到 hashmap 中,继续遍历。...a+b=sum,a和b越远乘积越小,因为数组是递增排序,所以一头一尾两个指针往内靠近的方法找到的就是乘积最小的情况。

    61720

    【双指针】和为s的两个数字

    和为target的两个数字 剑指 Offer 57. 和为s的两个数字 ​ 输入一个递增排序的数组和一个数字target,在数组中查找两个数,使得它们的和正好是target。...如果有多对数字的和等于target,则输出任意一对即可。...也就是说我们可以使用二分算法,但是二分算法在这道题其实还不算是最优解,并且我们二分算法还没讲,所以这里就不使用二分算法发来解决;另外还可以使用哈希表来解决,但因为插入和获取是需要时间的,所以在时间和空间上也不是最优解...nums[left] + nums[right] 和小了,要让 left++ nums[left] + nums[right] > target,说明此时和大了,要让 right...-- 重复上述操作,直到两个指针相遇 class Solution { public: vector twoSum(vector& nums, int target) {

    8500

    【Python实践-8】和为S的两个数字

    (剑指offer)输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。...思路:选定第一个数字,然后遍历后面的数字求和并与S比较,需要n-1次,不行的话再选定第2,3,,,n个数字,需要n^2次,时间复杂度比较高。...更简单的方法可以是定义两个指针,第一个指向第一个元素,第二个指向最后一个元素,两个元素相加,如果等于S则输出这两个元素,如果大于,则将第二个指针向前移一位,再求和进行比较;如果小于,则将第一个指针向前移一位...1 11 if data[i]+data[j]<tsum: 12 i=i+1 13 return () 知识点: 1、if not x是判断是否为None...注意代码完备性,需判断传入参数是否为空。 2、涉及到两个元素,想到定义两个指针,避免多层循环。 3、要考虑找不到两个数的情况,可以输出一个空列表或空元组。

    72420

    剑指Offer-和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。...,然后开始遍历数组找到和为sum的两个元素,从左到右找到的第一对和为sum的就是最小的一对。...代码实现 package Array; import java.util.ArrayList; import java.util.HashMap; /** * 和为S的两个数字 * 输入一个递增排序的数组和一个数字...S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。...,然后开始遍历数组找到和为sum的两个元素,从左到右找到的第一对和为sum的就是最小的一对。

    70440

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

    题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。...首先定义两个指针,第一个指针指向数组的第一个(也就是最小的)数字,第二个指针指向数组的最后一个(也就是最大的)数字。...当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于数字时,把较小的数字往后移动;当相等时,打完收工。这样扫描的顺序是从数组的两端向数组的中间扫描。...<<endl; return 0; } 题目:输入一个正数S,打印出所有和为S的连续正数序列(至少有两个数)。...如果从small到big的序列的和小于S,可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加small到(1+S)/2为止。

    74850

    【剑指offer:和为s的两个数字】双指针

    题目描述:输入一个递增排序的数组和一个数字 s,在数组中查找两个数,使得它们的和正好是 s。如果有多对数字的和等于 s,则输出任意一对即可。...示例: 输入:nums = [2,7,11,15], target = 9 输出:[2,7] 或者 [7,2] 解法:双指针 准备两个指针,left 指向数组开始,right 指向数组结尾 如果 nums...[left] 与 nums[right] 的和等于 target,那么返回 nums[left] 和 nums[right] 如果 nums[left] 与 nums[right] 的和大于 target...,那么说明应该缩小和,所有 right 指针右移 如果 nums[left] 与 nums[right] 的和小于 target,那么说明应该扩大和,所有 left 指针左移 其实整个过程就是两个指针,...根据所指向的数的和的大小,来不断向中间移动查找的过程。

    38520
    领券