1470. 重新排列数组(双指针+索引规律+分片)

142 阅读3分钟

image.jpeg

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 1 <= n <= 500
    • nums.length == 2n
    • 1 <= nums[i] <= 10^3

二、思路分析:

我们拿到本题,读取题目内容要求对2*n个元素[x1,x2,x3,xn,y1,y2,y3,y4]的数组,按照规则重新排序成[x1,y1,x2,y2,x3,y3,xn,yn]元素排序,了解到规则后,数组的特点如下:

  • 数组nums长度是2n,函数中会给出n
  • 数组中的元素都是数字类型的,范围在[1,10^3]

了解完题目内容后,解答本题我们能快速想到使用双指针方法快速模拟排序的过程,思路如下:

  • 方法一:双指针模拟

    • nums数组的长度为2n,所以定义两个指针x,y分别指向nums数组的起始0位置和n位置
    • 同时定义一个ans临时数组存储重新排序的nums元素
    • 使用for循环遍历n个元素,ans分别添加nums[x]和nums[y]的元素
    • 并且x和y分别向右+1
    class Solution(object):
        def shuffle(self, nums, n):
            """
            :type nums: List[int]
            :type n: int
            :rtype: List[int]
            """
            x = 0
            y = n
            ans = []
            for _ in range(n):
                ans.append(nums[x])
                ans.append(nums[y])
                x +=1
                y +=1
            return ans
    
  • 方法二:索引规律

    • 在该题中,数组的长度是2n,重新排序后数组ans的元素索引和原始数组nums的元素索引进行对比
    • ans[2*i]的元素指向是nums[i]的元素
    • ans[2*i+1]的元素指向是num[i+n]的元素
    • 因此使用for循环遍历nums前n个元素,将ans与nums元素进行赋值
    class Solution(object):
        def shuffle(self, nums, n):
            """
            :type nums: List[int]
            :type n: int
            :rtype: List[int]
            """
            ans = [0]*2*n
            for i in range(n):
                ans[2*i] = nums[i]
                ans[2*i+1] = nums[i+n]
            return ans
    
  • 方法三:列表分片法

    • Python中,数据类型为list具有分片的功能
    • 在nums数组中前n个元素,排序后是按照间隔2步位置,因此nums[::2]= nums[:n]
    • nums数组中后n个元素,排序后是排序在奇数位置上的,因此nums[1::2] = num[n:]
    class Solution(object):
        def shuffle(self, nums, n):
            nums[::2],nums[1::2]=nums[:n],nums[n:]
            return nums
    

三、总结:

本题对数组特性进行考察,在2*n的长度数组元素进行重新排序,除了使用双指针模拟外,还可以借助索引位置的规律、分片方法来求解,本题使用索引规律提交,AC记录如下:

image.png

  • 时间复杂度:O(n),n为传入的参数
  • 空间复杂度:O(1),没有使用额外空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~~