zoukankan      html  css  js  c++  java
  • 牛客网-和为S的两个数字

    题目描述

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

    输出描述:

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

    解决代码:自己想的有点麻烦和复杂化了,有一个规律是两个数距离越远乘积越小。
    # -*- coding:utf-8 -*-
    #递增序列
    #查找和为某个值的两个数
    #思路:进行二分查找(找到和这个值最相近的数),一步一步缩小查找的范围。
    class Solution:
        def FindNumbersWithSum(self, array, tsum):
            # write code here
            left = 1
            right = len(array)-1
            result = []
            multi = float('inf')
            last = 0
            for num in array:
                if left>right:
                    continue
                index = self.byteFind(array,left,right,tsum-num)
                if num+array[index]==tsum and num*array[index]<multi:
                        multi = num*array[index]
                        result.append([num,array[index]])
                left += 1
                right = index
            return result[-1] if len(result)!=0 else []
        def byteFind(self,array,left,right,target):
            if left>right:
                return right
            mid = (left+right)//2
            if array[mid]>target:
                return self.byteFind(array,left,mid-1,target)
            elif array[mid]<target:
                return self.byteFind(array,mid+1,right,target)
            else:
                return mid

    进阶:

    数列满足递增,设两个头尾两个指针i和j, 
    若ai + aj == sum,就是答案(相差越远乘积越小) 
    若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1 
    若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1 
    O(n)
    class Solution:
        def FindNumbersWithSum(self, array, tsum):
            # write code here
            left,right = 0,len(array)-1
            while(left<right):
                if array[left]+array[right]<tsum:
                    left += 1
                elif array[left]+array[right]>tsum:
                    right -= 1
                else:
                    return [array[left],array[right]]
            return []
  • 相关阅读:
    读书笔记之:Accelerated C++ 中文版[+]
    读书笔记之:C程序设计语言(第2版)[+++++]
    读书笔记之:C++精解与程序设计[]
    C/C++中的输入与输出及如何读取一行文本
    C/C++中的getline函数总结
    JM中的一些问题总结
    YUV主要采样格式理解
    读书笔记之:C++ Primer (第4版)及习题(ch12ch18) [++++]
    读书笔记之:C++ Primer (第4版)及习题(ch01ch11) [++++]
    读书笔记之:C++精髓·软件工程[]
  • 原文地址:https://www.cnblogs.com/ditingz/p/12149093.html
Copyright © 2011-2022 走看看