2021-08-06 LeetCode(力扣)算法入门 第2天|双指针

这篇博客探讨了两种使用双指针解决数组问题的方法。第一部分是有序数组的平方,通过遍历数组并平方每个元素,然后进行排序得到结果。第二部分是数组旋转问题,提出了不同的旋转策略,包括直接切片和插入操作,但遇到了时间效率问题。文章讨论了如何在满足条件的情况下优化这些算法。
摘要由CSDN通过智能技术生成


在这里插入图片描述

977. 有序数组的平方

数组双指针排序

给你一个按 非递减顺序 排序的整数数组 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]

  • 第一次成功提交的代码
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        s=[]
        for i in nums:
            s.append(i**2)
        s.sort()
        return s

在这里插入图片描述

  • 第二种方法:用的冒泡排序
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        s=[]
        for i in nums:
            s.append(i**2)
        for i in range(len(s)-1):
            for j in range(len(s)-i-1):
                if s[j] > s[j+1]:
                    s[j],s[j+1]=s[j+1],s[j]
        return s

测试用例虽然没问题,但是点提交超时,有大神看到的话希望可以指点一下
在这里插入图片描述
在这里插入图片描述

189. 旋转数组

数组数学双指针

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
进阶:

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

示例 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]

  • 自己写的
  • [ X] 直接切片拼接

在IDLE 里运行成功,满足题目要求,但是在力扣控制台里不显示正确结果

代码

def rotate(nums,k):
    K=k%len(nums)
    nums=nums[-K:]+nums[:-K]
    return nums
nums=[1,2,3,4,5,6,7]
k=10
print(rotate(nums,k))

运行结果:

在这里插入图片描述

测试了好几个k值都没问题,看评论里也在说直接切片这个问题,希望有大神看到可以指出哪里行不通

  • 删除和插入
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        for j in range(k):
            nums.insert(0,nums.pop())
        return nums

在这里插入图片描述

  • 看到评论区的方法
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        while k != 0:
            nums.insert(0,nums.pop())
            k -= 1
        return nums

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值