leetcode:189.旋转数组

2024-05-01 04:08
文章标签 leetcode 数组 旋转 189

本文主要是介绍leetcode:189.旋转数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

189. 旋转数组

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

示例 1:

输入: [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]

说明:

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

问题分析:

这个问题出现在好未来图像面试上当时想的是第三个笨方法。面试时出的是向左移动k个数。

方法一:使用Python切片操作,切开,颠倒,组合,完成。

class Solution:def rotate(self, nums, k):""":type nums: List[int]:type k: int:rtype: void Do not return anything, modify nums in-place instead."""n = len(nums)nums[:] = nums[n-k:] + nums[:n-k]if __name__ == "__main__":test = Solution()nums = [1,2,3,4,5,6,7]test.rotate(nums, 3)print(nums)

方法二:把这个 nums翻转, 然后再把对应的两个小区间翻转。(这方法也可以用Python中的nums[::-1]实现)

class Solution:def reverse(self, nums, start, end):while start < end:nums[start], nums[end] = nums[end], nums[start]start, end = start + 1, end - 1def rotate(self, nums, k):""":type nums: List[int]:type k: int:rtype: void Do not return anything, modify nums in-place instead."""n = len(nums)self.reverse(nums, 0, n - 1)self.reverse(nums, 0, k - 1)self.reverse(nums, k, n - 1)

方法三:最简单的想法,进行k次循环,每次循环转移所有元素。时间复杂度O(n*k) 、空间复杂度O(1)

class Solution:def rotate(self, nums, k):nums_len = len(nums)while k > 0:k-=1previous = nums[nums_len-1]for j in range(nums_len):nums[j], previous = previous, nums[j]

方法四:我们可以直接将阵列的每个数字放置在所需的正确位置。但如果我们这样做,我们将破坏原始元素。因此,我们需要将被替换的数字存储在temptemp变量中。然后,我们可以将替换的数字(temptemp)放在正确的位置。时间复杂度O(n) 、空间复杂度O(1)

 def rotate(self, nums, k):count = 0start = 0nums_len = len(nums)while count<nums_len:current = startprev = nums[start]next = (current+k) % nums_lenprev, nums[next] = nums[next], prev current = nextcount+=1while start!=current:next = (current+k) % nums_lenprev, nums[next] = nums[next], prev current = nextcount+=1start += 1

题目链接:leetcode-cn.com/problems/rotate-array/description/

参考:https://blog.csdn.net/XX_123_1_RJ/article/details/82905287

这篇关于leetcode:189.旋转数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950689

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists