【python】Leetcode(primer-pointer)

【python】Leetcode(primer-pointer)_第1张图片

文章目录

  • 26. 删除有序数组中的重复项(快慢指针)
  • 88. 合并两个有序数组(双指针)
  • 167. 两数之和 II - 输入有序数组(双指针)

更多 leetcode 题解可参考:【Programming】


26. 删除有序数组中的重复项(快慢指针)

【python】Leetcode(primer-pointer)_第2张图片
【python】Leetcode(primer-pointer)_第3张图片

注意:要对原数组进行改变

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        slow = 0
        fast = 1
        l = len(nums)

        while(fast<l):
            if nums[fast] != nums[slow]:
                slow+=1
                nums[slow] = nums[fast]
            fast+=1
        return slow+1

88. 合并两个有序数组(双指针)

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

  • 说明:
    初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
    你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
  • 示例:
    输入:
    nums1 = [1,2,3,0,0,0], m = 3
    nums2 = [2,5,6], n = 3
    输出: [1,2,2,3,5,6]

思路:题目中不能用别的数组来存排序后的结果,方法是采用两个指针,倒序遍历两个数组,比较大小,把较大的数字从后面依次放在数组1中,最后把数组2剩下的数字全部复制到数组1中!

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: None Do not return anything, modify nums1 in-place instead.
        """
        p1 = m-1
        p2 = n-1
        p12 = m+n -1

        while p1>=0 and p2>=0:
            if nums1[p1] >= nums2[p2]:
                nums1[p12] = nums1[p1]
                p1-=1
                p12-=1
            else:
                nums1[p12] = nums2[p2]
                p2-=1
                p12-=1        
        nums1[:p2+1] = nums2[:p2+1]

在这里插入图片描述


167. 两数之和 II - 输入有序数组(双指针)

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

  • 说明:
    返回的下标值(index1 和 index2)不是从零开始的。
    你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

  • 示例:
    输入: numbers = [2, 7, 11, 15], target = 9
    输出: [1,2]
    解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。


1)暴力法

class Solution(object):
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        list1 = []
        l = len(numbers)
        for i in range(l):
            for j in range(i+1,l):
                if numbers[i]+numbers[j]==target:
                    list1.append(i+1)
                    list1.append(j+1)
                    return list1

2)双指针
参考 https://blog.csdn.net/qq_17550379/article/details/80512745

我们可以这样想,我们首先判断首尾两项的和是不是 target,如果比 target 小,那么我们左边+1位置的数(比左边位置的数大)再和右相相加,继续判断。如果比 target 大,那么我们右边-1位置的数(比右边位置的数小)再和左相相加,继续判断。我们通过这样不断放缩的过程,就可以在 O(n) 的时间复杂度内找到对应的坐标位置。(这和快速排序的思路很相似)

class Solution(object):
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        l = len(numbers)
        left = 0
        right = l-1
        #for i in range(l):
        while left<right:
            if numbers[left] + numbers[right] == target:
                return [left+1,right+1]
            elif numbers[left] + numbers[right] > target:
                right-=1
            else:
                left+=1
        return []

1. 两数之和 无序用Hash

你可能感兴趣的:(Python,python,leetcode,windows)