Leetcode题解 - 双指针求n数之和

1. 两数之和

"""
双指针,题目需要返回下标,所以记录一个数字对应的下标
"""
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        r = [[ind, num] for ind, num in enumerate(nums)]
        r = sorted(r, key=lambda x: x[1])
        head = 0
        tail = len(r) - 1
        while head < tail:
            s = r[head][1] + r[tail][1]
            if s == target:
                return [r[head][0], r[tail][0]]
            elif s > target:
                tail -= 1
                # 跳过重复值,去重的规则都一样(下面的也是这样)
                while head < tail and r[tail][1] == r[tail+1][1]:
                    tail -= 1

            else:
                head += 1
                while head < tail and r[head][1] == r[head-1][1]:
                    head += 1

15. 三数之和

"""
双指针,所以先固定一个数字,用双指针来找到另外两个数字。注意记得剪枝,否则一定会超时的。(被超时操控的恐惧...
"""
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        vis = set()
        res = []
        for i in range(len(nums)):
            if nums[i] in vis:
                continue
            if nums[i] > 0:
                break
            vis.add(nums[i])
            head = i + 1
            tail = len(nums) - 1
            while head < tail and head < len(nums) and tail < len(nums):
                s = nums[i] + nums[head] + nums[tail]
                if not s:
                    res.append([nums[i], nums[head], nums[tail]])
                    head += 1
                    tail -= 1
                    # 跳过重复元素
                    while head < tail and nums[head] == nums[head - 1]:
                        head += 1
                    while head < tail and nums[tail] == nums[tail + 1]:
                        tail -= 1
                if s > 0:
                    tail -= 1
                    while head < tail and nums[tail] == nums[tail + 1]:
                        tail -= 1
                if s < 0:
                    head += 1
                    while head < tail and nums[head] == nums[head - 1]:
                        head += 1
        return res

18. 四数之和

"""
固定两个,双指针找另外两个
"""
class Solution:
    def fourSum(self, nums, target):
        nums.sort()
        res = []
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                head = j + 1
                tail = len(nums) - 1
                while head < tail:
                    s = nums[i] + nums[j] + nums[head] + nums[tail]
                    if s == target:
                        res.append([nums[i], nums[j], nums[head], nums[tail]])
                        head += 1
                        tail -= 1
                        while head < tail and nums[head] == nums[head - 1]:
                            head += 1
                        while head < tail and nums[tail] == nums[tail + 1]:
                            tail -= 1
                    elif s > target:
                        tail -= 1
                        while head < tail and nums[tail] == nums[tail + 1]:
                            tail -= 1
                    else:
                        head += 1
                        while head < tail and nums[head] == nums[head - 1]:
                            head += 1
        return list(set([tuple(i) for i in res]))

总结

可以看到,无论是2、3or4,都是固定除了双指针之外的元素,再用双指针去找剩下的元素,代码几乎没有改变,切记要记得剪枝。

原文地址:https://www.cnblogs.com/NFii/p/12079105.html

时间: 2024-10-03 01:53:49

Leetcode题解 - 双指针求n数之和的相关文章

LeetCode题解001:两数之和

两数之和 题目 给定一个整数数组 nums?和一个目标值 target,请你在该数组中找出和为目标值的那?两个?整数,并返回他们的数组下标 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] Java: 方法一:暴力法 暴力法很简单,就是用两遍循环的方式遍历nums class Solution {

编程题:求两数之和

#include<stdio.h>       /*包含输入输出头文件*/ main()                            /*定义主函数*/ {  int a,b,sum;                /*定义整数变量a.b.sum*/ a=123;                        /*给a赋值*/ b=456;                        /*给b赋值*/ sum=a+b;                  /*令sum=a+b*/ p

Leetcode(1)两数之和

Leetcode(1)两数之和 [题目表述]: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 第一种方法:暴力 执行用时:5352 ms: 内存消耗:12.9MB 效果:非常差 class Solution(object): def twoSum(self, nums, target): """ :type nums:

[leetcode数组系列]2三数之和

前言 秋招的结束,面试了大大小小的公司,最大的问题在于算法上.所以打算坚持在leetcode打卡,看看到底能不能行,如果你想见证,那我来开车,你坐稳,一起走向更好的远方. 在学习今天内容之前,先学习上一篇的两数之和会更好哟 leetcode两数之和求解 一 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满

【数据结构与算法】双指针思想——两数之和

两数之和 II - 输入有序数组 LeetCode:两数之和 II - 输入有序数组 题目描述: 给定一个已按照升序排列?的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1?必须小于?index2. 示例: 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 .因此 index1 = 1, index2 = 2 . 思想: 使用双

LeetCode 18. 4Sum (四数之和)

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: The solution set must not contain duplicate quadruplets. For exampl

[LeetCode] 3Sum Closest 最近三数之和

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {-1 2

LeetCode 15. 3Sum(三数之和)

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets. For example, given array S = [-1,

[LeetCode] 454. 4Sum II 四数之和II

Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] + B[j] + C[k] + D[l] is zero. To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the r