首页 > 其他分享 >LeetCode - 数组的旋转总结

LeetCode - 数组的旋转总结

时间:2022-10-02 22:55:16浏览次数:83  
标签:nums int 旋转 数组 ans LeetCode 翻转

1. 数组的旋转总结

数组的旋转指的是将数组的最后若干个数提前到数组前面,数组的翻转指的是将数组的顺序颠倒。旋转可以通过多次翻转实现。

数组的翻转很简单,通过双指针来实现:交换数组的第一个数和最后一个数,交换第二个数和倒数第二个数,一直到数组中间即可。

2. 题目记录

189. 轮转数组

分析题意

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

思路分析

其实题目就是一个数组旋转问题,我们可以通过图片来分析一下:

将上面这个数组向右轮转3个位置,其实就是:将数组的后3个元素旋转到数组前面,即:数组的旋转。前面我们讲到:数组的旋转可以通过多次数组翻转来实现

我们首先对整个数组进行翻转,然后对每一个子数组进行翻转,即:数组的旋转通过三次数组的翻转来实现。

class Solution {
    public void rotate(int[] nums, int k) {
        k = k % nums.length;
        // 整个数组进行翻转
        reverse(nums, 0, nums.length - 1);
        // 前k个元素进行翻转
        reverse(nums, 0, k - 1);
        // 剩余元素进行翻转
        reverse(nums, k, nums.length - 1);

    }

    void reverse(int[] nums, int left, int right){
        int temp = 0;
        while(left < right){
            temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left ++;
            right --;
        }
    }
}

复杂度分析

时间复杂度:\(O(n)\)
空间复杂度:\(O(1)\)

396. 旋转函数

分析题意

看到题目似乎我们需要模拟旋转操作,然后求出每次旋转之后的总和,并所有旋转总和中取最大值。

但其实只求最大值的话,我们无需进行模拟。让我们来看看不同旋转操作之间的规律性:

a = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6)
b = (1 * 4) + (2 * 3) + (3 * 2) + (0 * 6)
c = (2 * 4) + (3 * 3) + (0 * 2) + (1 * 6)
d = (3 * 4) + (0 * 3) + (1 * 2) + (2 * 6)

从上面我们可以分析一下a、b、c和d之间的关系:

b = a + 4 + 3 + 2 + 6 - 4 * 6
c = b + 4 + 3 + 2 + 6 - 4 * 2
d = c + 4 + 3 + 2 + 1 - 4 * 3

每次都等于上次的和加上数组总和减去当前遍历到的元素的n倍。

思路分析

class Solution {
    public int maxRotateFunction(int[] nums) {
        int sum = 0;
        int ans = 0;
        for(int i = 0; i < nums.length; i++){
            ans = ans + i * nums[i];
            sum += nums[i];
        }

        int pre = ans;
        for(int i = nums.length - 1; i >= 0; i--){
            pre = pre + sum - nums.length * nums[i];
            ans = Math.max(ans, pre);
        }
        return ans;
    }
}

复杂度分析

时间复杂度:\(O(n)\)

空间复杂度:\(O(1)\)

标签:nums,int,旋转,数组,ans,LeetCode,翻转
From: https://www.cnblogs.com/404er/p/array_transpose.html

相关文章

  • LeetCode 75 突破: 三数之和
    LeetCode75学习计划适用于想为技术面试做准备但不确定应该聚焦于哪些题目的用户。学习计划中的题目都是经过精心挑选的,Level1和Level2学习计划是为初级用户和中级用户......
  • 【Java】01基础-04数组
    1.数组1.1数组介绍数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。1.2数组的定义格式1.2.1第一种格式数据类型[]数组名示例:int[]arr;double[]......
  • [Oracle] LeetCode 54 Spiral Matrix 模拟
    Givenanmxnmatrix,returnallelementsofthematrixinspiralorder.Solution点击查看代码classSolution{public:vector<int>spiralOrder(vector<ve......
  • day11leetcode232,225,20,1047
    225.用队列实现栈利用两个栈来实现队列的基本操作一个负责进栈一个负责出栈classMyQueue{Stack<Integer>stackIn;Stack<Integer>stackOut;publi......
  • java--数组学习(2)数组的内存分析和数组三种初始化
    java的内存分析1.java内存分析:  2.数组初始化  例子代码默认初始化就是创建后int[]a=newint[10];里面有个0-9十个空间未赋值的情况下,里面都有值。基本......
  • 打印数组的全部排列
    打印数组的全部排列作者:Grey原文地址:博客园:打印数组的全部排列CSDN:打印数组的全部排列无重复值情况题目描述见:LeetCode46.Permutations主要思路由于是所有排列......
  • leetcode -- tree 4
    不同的二叉搜索树II递归#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=......
  • java---数组的学习
    数组数组是最简单的数据结构//无论定义什么都满足变量类型变量的名字=变量的值;int[]num;num=newint[10];//等同于下方写法int[]num=newint[10];一.数组的......
  • 代码随想录day8 ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 05.替换空
    344.反转字符串1classSolution{2public:3voidreverseString(vector<char>&s){4for(inti=0,j=s.size()-1;i<s.size()/2;i++......
  • 1008 数组元素循环右移问题
    1.1题目1.2题解1.3代码   题目:一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0​A1​⋯AN−1​)变换......