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

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

题目

题目描述

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

输出描述:

对应每个测试案例,输出两个数,小的先输出。

思路

同样是滑动窗口题目,设置左右两个游标,然后计算和,若和小,那么左侧游标增加,区间和大,右侧游标减小,保存结果的时候要比较一下更符合条件的数。

代码

  public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
    ArrayList<Integer> list = new ArrayList<>();
    int l = 0;
    int r = array.length - 1;
    int a = 0;
    int b = 0;
    int mul = Integer.MAX_VALUE;
    while (l < r) {
      int num = array[l] + array[r];
      if (num == sum) {
        int temp = array[l] * array[r];
        if (temp < mul) {
          mul = temp;
          a = array[l];
          b = array[r];
        }
        r--;
      } else if (sum > num) {
        l++;
      } else {
        r--;
      }
    }
    if (a != 0 && b != 0) {
      list.add(a);
      list.add(b);
    }
    return list;
  }

原文地址:https://www.cnblogs.com/blogxjc/p/12419591.html

时间: 2024-11-07 11:00:15

剑指offer 42.和为S的两个数字的相关文章

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the s

剑指offer系列45---和为s的两个数字

[题目]输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 1 package com.exe9.offer; 2 3 /** 4 * [题目]输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 5 * //如果有多对数字的和等于S,输出两个数的乘积最小的. 6 * @author WGS 7 * 8 */ 9 public class FindTwoNumberSum { 10 11 public boolean findTwoNumEq

剑指offer:和为S的两个数字

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 数列满足递增,设两个头尾两个指针i和j, 若ai + aj == sum,就是答案(相差越远乘积越小) 若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1 若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1 O(n) public ArrayList<Int

剑指offer (42) 单词翻转

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符顺序不变 题解分析: 两次翻转: 第一次翻转整个句子 第二次解析出每个单词并将单词翻转 void reverse(char* first, char* last) { assert(first != NULL && last != NULL); while (first < last) { char temp = *first; *first = *last; *last = temp; ++first; --last; }

剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]. 输出: 对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1. 样例输入:

《剑指Offer》附加题_用两个队列实现一个栈_C++版

在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push)栈的元素会第一个被弹出(pop);队列的特点是先进先出,即第一个进入队列的元素将会被第一个弹出来.虽然栈和队列特点是针锋相对,但是两者却相互联系,可以互相转换. 在"用两个队列实现一个栈"问题中,我们用两个队列的压入和弹出来模拟栈的压入和弹出.我们通过画图的手段把抽象的问题形象化. 在上

【Java】 剑指offer(39) 数组中出现次数超过一半的数字

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 思路 思路一:数字次数超过一半,则说明:排序之后数组中间的数字一定就是所求的数字. 利用partition()函数获得某一随机数字,其余数字按大小排在该数字的左右.若该

剑指offer面试题17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的.解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中. 可以有递归.循环两种方式来解决. 1 package Solution; 2 3 4 public class No17MergeSortedLists { 5 6 public static class ListNode { 7 int data; 8 ListNode next; 9 10 publi

【剑指offer 面试题17】合并两个排序的链表

思路: 比较两个链表端点值的大小,通过递归的方式排列. 1 #include <iostream> 2 using namespace std; 3 4 struct ListNode 5 { 6 int val; 7 ListNode *next; 8 ListNode(int v = 0):val(v), next(NULL){} 9 }; 10 11 ListNode *SortedListMerge(ListNode *phead1, ListNode *phead2) 12 { 13