zoukankan      html  css  js  c++  java
  • 剑指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 []
  • 相关阅读:
    第二周进度条博客
    软件工程个人作业01
    动手动脑1
    构建之法阅读笔记06
    构建之法阅读笔记05
    构建之法阅读笔记04
    poj 1631 LIS
    poj 1609 dp
    lightoj 1198 最大权重匹配
    hdu4696 想法题
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14090316.html
Copyright © 2011-2022 走看看