Python 双指针实际应用(一)

1.这是一篇数据结构学习的开头,仅供个人参考以及博主:-小黄怪- 参考学习。

2.主要是拿来给自己做笔记的,学啥记啥,有意思的就记。

3.接下来的日子,不定时更新,内容看个人学习,yeah,加油。

本文主要是LeetCode上关于双指针的应用题。

想要了解双指针的使用技巧可以浏览链接:

Python技巧之双指针_赵卓不凡的博客-CSDN博客_python 实现双指针

题目1:有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

思路:题目有个比较关键的点就是数组是一个非递减性,平方后大小趋势会是一个U形变化,因此只需要从数组两边开始比较平方后的大小将值插入一个行的列表即可。

# 有序数组的平方
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        # 定义头尾双指针
        i = 0
        j = len(nums)-1
        list = []
        while i <= j:
            if pow(nums[i],2) >= pow(nums[j],2):
                list.insert(0,pow(nums[i],2))
                i = i+1
            elif pow(nums[i],2) < pow(nums[j],2):
                list.insert(0,pow(nums[j],2))
                j = j-1
        return list

题目2:轮转数组

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

示例 2:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

进阶:

  • 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
  • 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

思路:怎么说呢 没有用到双指针 感觉没有必要。。。就都有了python里列表的相关知识去解决了。主要是列表的常用函数pop()、insert()和列表的切片。

# 轮转数组
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        # 解法1.理解列表的常用函数,根据循环得出结果
        # for _ in range(k):
        #     a = nums.pop()
        #     nums.insert(0,a)
        # 解法2.列表的切片,以及python的数值交换
        # n = len(nums)
        # k = k%n
        # if n >1 and k >0:
        #     nums[:-k],nums[-k:] = nums[-k:],nums[:-k]
        # 解法3.列表切片
        n = len(nums)
        k %= n
        nums[:] = nums[-k:]+nums[:-k]
        print(nums)

if __name__ == '__main__':
    a = Solution()
    # print(a.rotate(nums = [1,2,3,4,5,6,7], k = 3))
    print(a.rotate(nums = [1,2], k = 3))

题目3:轮转数组

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

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

示例 2:

输入: nums = [0]输出: [0]

思路:本题是要将数组里出现的零移到后面,一开始就想的从后往前遍历 找到一个删掉它 然后就在列表最后append就好了,但是又用到了列表的函数,没有用到双指针。解法二就是使用双指针来解决问题,主要是定义两个指针,指针j主要是数值遍历的值,而i定义为找到那些数值为0的下标。

(图是别人的 看起来容易懂)

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        # 使用python自带函数解决 不太符合题意
        for i in range(len(nums)-1,-1,-1):
            if nums[i] == 0:
                nums.pop(i)
                nums.append(0)
        return nums

        # 使用双指针解决问题
        i = -1
        for j in range(len(nums)):
            if nums[j] !=0:
                i += 1
                nums[i],nums[j] = nums[j],nums[i]
        return nums
if __name__ == '__main__':
    a = Solution()
    print(a.moveZeroes(nums = [0,1,0,1]))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值