Python算法题集_轮转数组

本文为Python算法题集之一的代码示例

题目189

题目:轮转数组

说明:给定一个整数数组 nums,将数组中的元素向右轮转 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]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

- 代码分析

  1. 本题为求数组元素的移动
  2. 最笨的办法是挨个赋值,单层循环,所以基本的时间算法复杂度为(On)

- 优化思路

  1. 减少循环层次

  2. 增加分支,减少计算集合

  3. 采用内置算法来提升计算效率

  4. 分析题目特点,分析最优解

    1)本题最简单的解法为数组切片连接【链表切片、连接都是(O(1))】,但是网站不认,只能自己测

    2)建立两个切片副本,循环更新元素是标准做法

    3)建立数组副本,直接计算下标在循环中更新元素,减少一次切片操作

    4)实施数组的反转操作,可以不用建立数据缓冲,直接完成更新


- 测量工具

  • CheckFuncPerf是我写的函数用时和内存占用模块,地址在这里:Python算法题集_检测函数用时和内存占用的模块【自搓】

1. 标准求解【双切片】

仅仅通过,超过12%在这里插入图片描述

import CheckFuncPerf as cfp

def rotate_base(nums, k) :
    kx = k % len(nums)
    list1 = nums[:len(nums)-kx]
    list2 = nums[len(nums)-kx:]
    iIdx = 0
    while list2:
        nums[iIdx] = list2.pop(0)
        iIdx+=1
    while list1:
        nums[iIdx] = list1.pop(0)
        iIdx+=1
    return nums

import random
nums=[]
for iIdx in range(100000):
    nums.append(random.randint(0, 10000))
k = 1357
result = cfp.getTimeMemoryStr(rotate_base, nums, k)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))

# 运行结果
函数 rotate_base 的运行时间为 886.20 ms;内存使用量为 860.00 KB 执行结果 = 100000

2. 改进版【数组副本+计算下标】

飞龙在天,超越97%在这里插入图片描述

简单的改进取得97%的性能,说明本题改进的空间不大

import CheckFuncPerf as cfp

def rotate_ext1(nums, k) :
    numscopy = nums.copy()
    kx = k % len(nums)
    for iIdx in range(len(nums)):
        nums[iIdx] = numscopy[iIdx-kx]
    return nums

import random
nums=[]
for iIdx in range(100000):
    nums.append(random.randint(0, 10000))
k = 1357
result = cfp.getTimeMemoryStr(rotate_base, nums, k)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))

# 运行结果
函数 rotate_ext1 的运行时间为 8.00 ms;内存使用量为 4.00 KB 执行结果 = 100000

3. 空间改进版【不用数据副本,三次反转】

表现优良,超越86%在这里插入图片描述

import CheckFuncPerf as cfp

def rotate_ext2(nums, k):
    nums.reverse()
    kx = k % len(nums)
    len1, len2 = kx // 2, (len(nums)-kx) // 2
    for iIdx in range(len1):
        nums[iIdx], nums[kx-iIdx-1] = nums[kx-iIdx-1], nums[iIdx]
    for iIdx in range(len2):
        nums[kx+iIdx], nums[-iIdx-1] = nums[-iIdx-1], nums[kx+iIdx]
    return nums

import random
nums=[]
for iIdx in range(100000):
    nums.append(random.randint(0, 10000))
k = 1357
result = cfp.getTimeMemoryStr(rotate_base, nums, k)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))

# 运行结果
函数 rotate_ext2 的运行时间为 11.99 ms;内存使用量为 0.00 KB 执行结果 = 100000

4. 王者归来【采用列表切片+合并】

网站虽然不认,还是无冕之王 ,管你数组多大,都只要1毫秒

import CheckFuncPerf as cfp

def rotate_ext3(nums, k):
    kx = k % len(nums)
    list1 = nums[:len(nums)-kx]
    list2 = nums[len(nums)-kx:]
    nums = list2 + list1
    return nums

import random
nums=[]
for iIdx in range(100000):
    nums.append(random.randint(0, 10000))
k = 1357
result = cfp.getTimeMemoryStr(rotate_base, nums, k)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))

# 运行结果
函数 rotate_ext3 的运行时间为 1.00 ms;内存使用量为 792.00 KB 执行结果 = 100000

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/362275.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop3.x基础(2)- HDFS

来源&#xff1a;B站尚硅谷 目录 HDFS概述HDFS产出背景及定义HDFS优缺点HDFS组成架构HDFS文件块大小&#xff08;面试重点&#xff09; HDFS的Shell操作&#xff08;开发重点&#xff09;基本语法命令大全常用命令实操准备工作上传下载HDFS直接操作 HDFS的API操作HDFS的API案例…

微信小程序(二十八)网络请求数据进行列表渲染

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.GET请求的规范 2.数据赋值的方法 源码&#xff1a; index.wxml <!-- 列表渲染基础写法&#xff0c;不明白的看上一篇 --> <view class"students"><view class"item">&…

yolov8训练自己的关键点检测模型

参考&#xff1a; https://blog.csdn.net/weixin_38807927/article/details/135036450 标注数据集 安装labelme pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple如果报错 $ labelme 2024-01-31 03:16:20,636 [INFO ] __init__:get_config:67- Loading …

MIMIC-IV数据库, 如何提取哪些肺栓塞病人进行了溶栓手术治疗?

溶栓手术是通过药物或者手术的方式&#xff0c;使闭塞的血管再通的一种手术。 溶栓手术主要是通过药物或者手术的方式&#xff0c;使闭塞的血管再通的一种手术。常用的药物有尿激酶、链激酶等&#xff0c;这些药物可以激活纤溶酶原&#xff0c;使纤溶酶原转化为纤溶酶&#xff…

Shell的字符处理和expect

一、Here Document免交互 1.1Here Document概述 使用I/O重定向的方式将命令列表提供给交互式程序&#xff0c;标准输入的一种替代品 格式: 命令 <<标记 输入内容 标记 1.2Here Document使用注意事项 标记可以使用任意合法字符结尾的标记一定要顶格写&#xff0c;前面…

DEV-C++ ege.h库 绘图教程(九)

一、Getting Start 前情回顾&#xff1a; DEV-C ege.h库 绘图教程 今天我们将来讲一讲一些关于杂项的函数。 二、控制台函数 1.initconsole 初始化并显示控制台窗口。 &#xff08;但因为Dev C默认就是显示窗口的&#xff0c;所以这个函数一点也没用&#xff09; 但如果想…

基于C++的面向对象程序设计:类与对象的深入剖析

面向对象程序设计的基本特点 面向对象程序设计的基本特点包括&#xff1a;抽象、封装、继承、多态。 抽象 抽象是指对具体问题或对象进行概括&#xff0c;抽出其公共性质并加以描述的过程。一般情况抽象分为数据抽象和行为抽象&#xff0c;其中数据抽象是指一个对象区别于另…

二叉树顺序结构堆实现

目录 Test.c测试代码 test1 test2 test3 &#x1f387;Test.c总代码 Heap.h头文件&函数声明 头文件 函数声明 &#x1f387;Heap.h总代码 Heap.c函数实现 ☁HeapInit初始化 ☁HeapDestroy销毁 ☁HeapPush插入数据 【1】插入数据 【2】向上调整Adjustup❗ …

关于谷歌新版调试用具(Chrome Dev Tool ),网络选项(chrome-network)默认开启下拉模式的设置

今天在使用谷歌浏览器进行调试的时候&#xff0c;打开调试工具网络选项发现过滤不同模式的选项卡不见了&#xff0c;转而变成一个下拉式选项&#xff0c;如下图 这样一来使得切换不同类型查看的时候变得非常不方便&#xff0c;然后网上查了一下发现这个功能谷歌在很早版本就已…

Mysql 主从库的重新配置

1.从库和主库的数据差异实在太大&#xff0c;反复处理数据耗时耗力&#xff0c;不如重做。 2.备份主数据库(命令备份的) usr/local/mysql/bin/mysqldump -h 100.1.4.42 -P 5566 -u root -p 备份数据库 > /mysql/db/备份的名称.sql 3.停止从库复制 登录到MySQL从库&#x…

腾讯云邀请你参与【腾讯2024技术答人挑战赛】 赢取丰厚的礼品

腾讯云邀请你参与【腾讯2024技术答人挑战赛】 赢取丰厚的礼品 2024年 腾讯礼品大派送 保持技术好奇心是程序员构建护城河的重要一环&#xff0c;快来测测你现在的技术知识面在中国程序员中排第几&#xff1f; 参与答题更有iPad、Pico VR游戏机、Switch等、腾讯云官方认证证书好…

Prometheus+grafana配置监控系统

使用docker compose安装 方便拓展, 配置信息都放在在 /docker/prometheus 目录下 1.目录结构如下 . ├── conf │ └── prometheus.yml ├── grafana_data ├── prometheus_data └── prometheus_grafana.yaml2.创建目录文件 mkdir /docker/prometheus &&am…

Leetcode—2670. 找出不同元素数目差数组【简单】

2024每日刷题&#xff08;一零七&#xff09; Leetcode—2670. 找出不同元素数目差数组 实现代码 class Solution { public:vector<int> distinctDifferenceArray(vector<int>& nums) {unordered_set<int> s;int n nums.size();vector<int> dif…

CapCut - 剪映国际版11.0.0

【应用名称】&#xff1a;CapCut - 剪映国际版 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#CapCut #剪映国际版 【应用版本】&#xff1a;11.0.0 【应用大小】&#xff1a;231MB 【软件说明】&#xff1a;软件升级更新。目前大家广泛使用的最令人惊叹、最专业…

linux环境安装git、maven、jenkins等

重启 jenkins的命令&#xff1a; systemctl start jenkins 如果没有vim 命令 可以使用 yum install vim 安装 vim git 下载包地址 https://www.kernel.org/pub/software/scm/git/git-2.28.0.tar.gz 1.安装依赖环境&#xff1a; yum install -y curl-devel expat-devel ge…

2023年03月CCF-GESP编程能力等级认证Python编程二级真题解析

一、单选题(共15题,共30分) 第1题 以下存储器中的数据不会受到附近强磁场干扰的是( )。 A:硬盘 B:U 盘 C:内存 D:光盘 答案:D 第2题 下列流程图,属于计算机的哪种程序结构?( ) A:顺序结构 B:循环结构 C:分支结构 D:数据结构 答案:C 第3题 以下选…

C#用正则表达式判断字符串是否纯数字vs用Char.IsDigit 方法遍历字符数组是否纯数字

目录 一、使用的方法 1.正则表达式 2.Char.IsDigit 方法 二、源码 1.源代码 2.生成效果 一、使用的方法 1.正则表达式 在程序运行过程中&#xff0c;经常需要用户输入数字信息&#xff0c;如输入员工年龄、工资等。使用正则表达式Regex类的IsMatch方法&#xff0c;可以有…

2015年苏州大学837复试机试C/C++

2015年苏州大学复试机试 第一题 题目 有36块砖&#xff0c;现在有36个人&#xff0c;男人能搬4块&#xff0c;女人能搬3块&#xff0c;小孩子两人搬一块&#xff0c;求一次搬完这些砖要男人&#xff0c;女人&#xff0c;小孩多少人&#xff1f; 代码 #include <iostrea…

分析HarmonyOS应用/服务的CPU活动性能

CPU Profiler 性能分析是用来分析CPU性能瓶颈的工具&#xff0c;可以实时查看应用/服务的CPU使用率和线程活动&#xff0c;也可以查看记录的方法跟踪数据、方法采样数据和系统跟踪数据的详情。基于CPU性能分析&#xff0c;您可以了解在一段时间内执行了哪些方法&#xff0c;以及…

Python行定位符

在Python中&#xff0c;每一行代码都有其特定的位置和作用&#xff0c;而行定位符则是指定或确定代码所在行的一种方法。通过行定位符&#xff0c;开发者可以准确地指定代码的位置&#xff0c;从而对程序进行调试、错误处理等操作。本文将详细介绍Python中常见的行定位符&#…