剑指offer -和为S的两个数字 - python

题目描述:

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

思路:

  • 暴力搜索:

    • 找到所有的两个数和为S的集合
    • 然后依次遍历和为S的集合中的元素,并设置flag标记当前乘积最小的两个数,最后返回flag
  • 指针法:设置两个指针leftright分别指向数组的头和尾

    • 如果 a r r a y [ l e f t ] + a r r a y [ r i g h t ] < S array[left] + array[right] < S array[left]+array[right]<S,说明当前元素和小了,则left右移
    • 如果 a r r a y [ l e f t ] + a r r a y [ r i g h t ] > S array[left] + array[right] > S array[left]+array[right]>S,说明当前元素和大了,则right左移
    • 如果 a r r a y [ l e f t ] + a r r a y [ r i g h t ] = = S array[left] + array[right] == S array[left]+array[right]==S,则直接返回 [ a r r a y [ l e f t ] , a r r a y [ r i g h t ] ] [array[left], array[right]] [array[left],array[right]]即可

AC代码

暴力搜索

# -*- coding:utf-8 -*-
import sys
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        if array == []:
            return []
        
        res = []
        for i in range(len(array)):
            if tsum - array[i] in array[i + 1:]:
                res.append([array[i], tsum - array[i]])
                    
        t = sys.maxsize
        flag = []
        for i in res:
            number = i[0] * i[1]
            if number < t:
                t = number
                flag = i 

        return flag

因为数组递增有序,搜索法也可以简化为如下的形式:

# -*- coding:utf-8 -*-
import sys
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        if array == []:
            return []
       
        for i in range(len(array)):
            t = array[i + 1:]
            t.reverse()
            if tsum - array[i] in t:
                return [array[i], tsum - array[i]]
        
        return []

指针法


class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        if not array :
            return []
        first = 0
        lenth = len(array) - 1
        last = lenth
        while last > first:
            if array[first] + array[last] > tsum:
                last -= 1
            elif array[first] + array[last] < tsum:
                first += 1
            elif array[first] + array[last] == tsum:
                return [array[first],array[last]]
        return []

你可能感兴趣的:(剑指offer)