第七章 two points

587—两数之和-不同组成
给一整数数组, 找到数组中有多少组 不同的元素对 有相同的和, 且和为给出的 target 值, 返回对数.

样例
Example 1:

Input: nums = [1,1,2,45,46,46], target = 47
Output: 2
Explanation:

1 + 46 = 47
2 + 45 = 47

Example 2:

Input: nums = [1,1], target = 2
Output: 1
Explanation:
1 + 1 = 2

#2019/9/7
#双指针
import sys
class Solution:
    def twoSum6(self,nums,target):
        if not nums:
            return 0

        nums.sort()

        left,right = 0,len(nums)-1
        count = 0
        while left < right:
            value = nums[left]+nums[right]
            if target == value:
                count += 1
                left += 1
                right -= 1
                while left < right and nums[left] == nums[left-1]:
                    left += 1
                while left < right and nums[right] == nums[right+1]:
                    right -= 1
            elif target > value:
                left += 1
            else:
                right -= 1
        return count

A = list(map(int, sys.stdin.readline().strip().split(',')))
a = Solution()
tar = int(input())
print(a.twoSum6(A,tar))

  1. 两数和 II-输入已排序的数组
    中文English
    给定一个已经 按升序排列 的数组,找到两个数使他们加起来的和等于特定数。
    函数应该返回这两个数的下标,index1必须小于index2。注意返回的值不是 0-based。

Example
例1:

输入: nums = [2, 7, 11, 15], target = 9
输出: [1, 2]
例2:

输入: nums = [2,3], target = 5
输出: [1, 2]
Notice
你可以假设每个输入刚好只有一个答案

##2019/9/8
import sys
class Solution:
    def twoSum(self,nums,target):
        if not nums:
            return []

        left,right = 0,len(nums)-1
        while left < right:
            value = nums[left]+nums[right]
            if value == target:
                return [left+1,right+1]
            elif value < target:
                left += 1
            else:
                right -= 1
        return []

A = list(map(int, sys.stdin.readline().strip().split()))
a = Solution()
tar = int(input())
print(a.twoSum(A,tar))

609_小于或等于目标值

给定一个整数数组,找出这个数组中有多少对的和是小于或等于目标值。返回对数。

您在真实的面试中是否遇到过这个题? 是

样例
给定数组为 [2,7,11,15],目标值为 24
返回 5。
2+7<24
2+11<24
2+15<24
7+11<24
7+15<24

#2019/9/8
import sys
class Solution:
    def twoSum5(self,nums,target):
        if not nums:
            return 0

        nums.sort()
        left,right = 0,len(nums) - 1
        ans = 0
        while left < right:
            value = nums[left] + nums[right]
            if value <= target:
                ans += right - left
                left += 1
            else:
                right -= 1
        return ans

A = list(map(int, sys.stdin.readline().strip().split(',')))
a = Solution()
tar = int(input())
print(a.twoSum5(A,tar))

610_两数和-差等于目标值
给定一个整数数组,找到两个数的 差 等于目标值。index1必须小于index2。注意返回的index1和index2不是 0-based。

样例
例1:

输入: nums = [2, 7, 15, 24], target = 5
输出: [1, 2]
解释:
(7 - 2 = 5)
例2:

输入: nums = [1, 1], target = 0
输出: [1, 2]
解释:
(1 - 1 = 0)
注意事项
保证只有一个答案。

##哈希表+一次数组扫描
#2019/9/9
#存在的两种关系:-num1-num2=target---num1-target=num2
#-num2-num1=target---num1+target=num2
import sys

class Solution:
    def twoSum7(self,nums,target):
        if not nums:
            return []

        cache = {}
        for i in range(len(nums)):
            if nums[i] - target in cache:
                return [cache[nums[i] - target] + 1, i + 1]

            if nums[i] + target in cache:
                return [cache[nums[i] + target] + 1, i + 1]

            cache[nums[i]] = i

        return []

A = list(map(int, sys.stdin.readline().strip().split(',')))
a = Solution()
tar = int(input())
print(a.twoSum7(A,tar))
  1. 两数之和 III-数据结构设计
    中文English
    设计b并实现一个 TwoSum 类。他需要支持以下操作:add 和 find。
    add -把这个数添加到内部的数据结构。
    find -是否存在任意一对数字之和等于这个值

Example
样例 1:

add(1);add(3);add(5);
find(4)//返回true
find(7)//返回false

// An highlighted block
var foo = 'bar';
  1. 三数之和
    中文English
    给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。

Example
例1:

输入:[2,7,11,15]
输出:[]
例2:

输入:[-1,0,1,2,-1,-4]
输出:[[-1, 0, 1],[-1, -1, 2]]
Notice
在三元组(a, b, c),要求a <= b <= c。

结果不能包含重复的三元组。

// An highlighted block
var foo = 'bar';
  1. 两数之和
    中文English
    给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。

Example
Example1:
给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1].
Example2:
给出 numbers = [15, 2, 7, 11], target = 9, 返回 [1, 2].
Challenge
Notice
你可以假设只有一组答案。

// An highlighted block
var foo = 'bar';

443 两数之和II
描述
给一组整数,问能找出多少对整数,他们的和大于一个给定的目标值。
样例
对于 numbers = [2, 7, 11, 15], target = 24 的情况,返回 1。因为只有11 + 15可以大于24。

// An highlighted block
var foo = 'bar';
  1. 最接近的三数之和
    中文English
    给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。

Example
例1:

输入:[2,7,11,15],3
输出:20
解释:
2+7+11=20
例2:

输入:[-1,2,1,-4],1
输出:2
解释:
-1+2+1=2
Challenge
O(n^2) 时间, O(1) 额外空间。

Notice
只需要返回三元组之和,无需返回三元组本身

// An highlighted block
var foo = 'bar';
  1. 三角形计数
    中文English
    给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?

Example
样例 1:

输入: [3, 4, 6, 7]
输出: 3
解释:
可以组成的是 (3, 4, 6),
(3, 6, 7),
(4, 6, 7)
样例 2:

输入: [4, 4, 4, 4]
输出: 4
解释:
任何三个数都可以构成三角形
所以答案为 C(3, 4) = 4

// An highlighted block
var foo = 'bar';
  1. 四数之和
    中文English
    给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。

Example
例1:

输入:[2,7,11,15],3
输出:[]

例2:

输入:[1,0,-1,0,-2,2],0
输出:
[[-1, 0, 0, 1]
,[-2, -1, 1, 2]
,[-2, 0, 0, 2]]
Notice
四元组(a, b, c, d)中,需要满足a <= b <= c <= d

答案中不可以包含重复的四元组。

// An highlighted block
var foo = 'bar';
  1. 有效回文串
    中文English
    给定一个字符串,判断其是否为一个回文串。只考虑字母和数字,忽略大小写。

Example
样例 1:

输入: “A man, a plan, a canal: Panama”
输出: true
解释: “amanaplanacanalpanama”
样例 2:

输入: “race a car”
输出: false
解释: “raceacar”
Challenge
O(n) 时间复杂度,且不占用额外空间。

Notice
你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题。

在这个题目中,我们将空字符串判定为有效回文。

// An highlighted block
var foo = 'bar';
  1. 数组划分
    中文English
    给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:

所有小于k的元素移到左边
所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。

Example
例1:

输入:
[],9
输出:
0

例2:

输入:
[3,2,2,1],2
输出:1
解释:
真实的数组为[1,2,2,3].所以返回 1
Challenge
使用 O(n) 的时间复杂度在数组上进行划分。

Notice
你应该真正的划分数组 nums,而不仅仅只是计算比 k 小的整数数,如果数组 nums 中的所有元素都比 k 小,则返回 nums.length。

// An highlighted block
var foo = 'bar';

625 数组划分2

描述

将一个没有经过排序的整数数组划分为 3 部分:
1.第一部分中所有的值都 < low
2.第二部分中所有的值都 >= low并且 <= high
3.第三部分中所有的值都 > high
返回任意一种可能的情况。

注意事项

在所有测试数组中都有 low <= high。

样例

给出数组[4,3,4,1,2,3,1,2],low =2,high =3。变为
[1,1,2,3,2,3,4,4],([1,1,2,2,3,3,4,4] 也是正确答案,但 [1,2,1,2,3,3,4,4] 不是)

// An highlighted block
var foo = 'bar';
  1. 颜色分类
    中文English
    给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。

我们可以使用整数 0,1 和 2 分别代表红,白,蓝。

Example
样例 1

输入 : [1, 0, 1, 2]
输出 : [0, 1, 1, 2]
解释 : 原地排序。
Challenge
一个相当直接的解决方案是使用计数排序扫描2遍的算法。

首先,迭代数组计算 0,1,2 出现的次数,然后依次用 0,1,2 出现的次数去覆盖数组。

你否能想出一个仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法?

Notice
不能使用代码库中的排序函数来解决这个问题。
排序需要在原数组中进行。

// An highlighted block
var foo = 'bar';
  1. 移动零
    中文English
    给一个数组 nums 写一个函数将 0 移动到数组的最后面,非零元素保持原数组的顺序

Example
例1:

输入: nums = [0, 1, 0, 3, 12],
输出: [1, 3, 12, 0, 0].
例2:

输入: nums = [0, 0, 0, 3, 1],
输出: [3, 1, 0, 0, 0].
Notice
1.必须在原数组上操作
2.最小化操作数

// An highlighted block
var foo = 'bar';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值