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

题目描述

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

返回值描述:

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

示例

输入        [1,2,4,7,11,15],15

返回值    [4,11]

知识点回顾

数学、数组、双指针

代码

解法一:暴力解题,双重循环,时间复杂度:O(n^2)

# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        lenth=len(array)
        for i in range(lenth):
            for j in range(i+1,lenth):
                if array[i]+array[j]==tsum:
                    try:
                        if array[i]*array[j]<a*b:
                            a=array[i]
                            b=array[j]
                    except:
                        a=array[i]
                        b=array[j]
        try:
            return [a,b]
        except:
            return []

解法二:双指针,时间复杂度:O(n)

因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:
1.初始化:指针i指向数组首, 指针j指向数组尾部
2. 如果arr[i] + arr[j] == sum , 说明是可能解,同时++i、--j寻找下一组
3. 否则如果arr[i] + arr[j] > sum, 说明和太大,所以--j
4. 否则如果arr[i] + arr[j] < sum, 说明和太小,所以++i

# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        lenth=len(array)
        i,j=0,lenth-1
        while i<j:
            tmp=array[i]+array[j]
            if tmp==tsum:
                try:
                    if array[i]*array[j]<a*b:
                        a=array[i]
                        b=array[j]
                except:
                    a=array[i]
                    b=array[j]
                i+=1
                j-=1
            elif tmp<tsum:
                i+=1
            else:
                j-=1
        try:
            return [a,b]
        except:
            return []

 

 

posted @ 2020-12-06 18:42  foolangirl  阅读(69)  评论(0编辑  收藏  举报