旋转数组 空间复杂度为O(1) 的2 种方法 + 1种空间复杂度O(n)
题目地址 : 旋转数组.
网上好多不是根本就是错的,就是空间复杂度不是真正为1
下面总结一下
方法1
普通方法(空间复杂度不满足要求,但是题目并不会判错,说明他们没用对空间进行校验)
···
public void rotate1(int[] nums, int k) {
if(nums.length == 1 || k == 0) return;
k = k % nums.length;
int[] ans = new int[nums.length];
for (int i = 0, j = k; i < nums.length; i++) {
ans[j] = nums[i];
j = (j+1) % nums.length;
}
System.out.println("Arrays.toString(ans) = " + Arrays.toString(ans));
for(int i = 0; i < nums.length; i++){
nums[i] = ans[i];
}
}
···
方法2:
3次倒置,这个方法思路很巧妙,很经典。
先全部倒置,然后0到k-1倒置,然后k到最后再倒置,就得到了正确结果,空间复杂度1,(交换只耗费1个额外空间)
倒置当然要自己写,用java自带的肯定就超过1空间复杂度了
方法3
这是我自己想的方法,每次把当前的给正确的位置,然后在把正确位置上的那个再给下一个正确的位置,但是这个方法有个坑,就是不一定一次轮回就能搞定,如果k和length都是偶数就会超过一次轮回。
我也没研究出来到底是几次轮回,但是有一种简单的方法,就是每次调换一次,就cnt++,当cnt==length的时候就完成了。在这之前不断轮回,每次轮回,从当前的位置+1. 第一次轮回把nums[0]当成一个临时变量(每次轮回完了,num[0]自动会是正确的数字, 第二次轮回就是num[1]...)
public void rotate(int[] nums, int k) {
if(nums.length == 1 || k == 0) return;
k = k % nums.length;
int cnt = 0, r = 0, j;
while(cnt < nums.length){
j = k + r;
while (true) {
System.out.println(nums[r] + " " + nums[j]);
int t = nums[j];
nums[j] = nums[r];
nums[r] = t;
j = (j + k) % nums.length;
cnt++;
if(j == r){
cnt++;
break;
}
}
System.out.println(Arrays.toString(nums));
r++;
}
// System.out.println( Arrays.toString(nums));
}
旋转数组 空间复杂度为O(1) 的2 种方法 + 1种空间复杂度O(n)的更多相关文章
- leetCode 81.Search in Rotated Sorted Array II (旋转数组的搜索II) 解题思路和方法
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...
- 《剑指offer》面试题8 旋转数组的最小数字 Java版
(找递增排序旋转数组中的最小数字) 书中方法:这种题目就是要寻找数组的特点,然后根据这个特点去写.旋转后的递增数组分为两段递增序列,我们找到中点,如果比第一个元素大,表示在第一段递增序列里,如果比第一 ...
- C# byte[]数组和string的互相转化 (四种方法)
C# byte[]数组和string的互相转化 (四种方法) 第一种 [csharp] view plain copy string str = System.Text.Encoding.UTF8.G ...
- js数组和字符串去重复几种方法
js数组去重复几种方法 第一种:也是最笨的吧. Array.prototype.unique1 = function () { var r = new Array(); label:for(var i ...
- [LeetCode] Rotate Array 旋转数组
Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...
- 【LeetCode每天一题】Search in Rotated Sorted Array(在旋转数组中搜索)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., ...
- leecode刷题(3)-- 旋转数组
leecode刷题(3)-- 旋转数组 旋转数组 给定一个数组,将数组中的元素向右移动 K 个位置,其中 K 是非负数. 示例: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5, ...
- 旋转数组 [ LeetCode ]
原题地址:https://leetcode-cn.com/problems/rotate-array/description/ 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...
- 剑指Offer - 九度1386 - 旋转数组的最小数字
剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...
随机推荐
- 2019-11-29-VisualStudio-2019-尝试使用-C#-8.0-新的方式
title author date CreateTime categories VisualStudio 2019 尝试使用 C# 8.0 新的方式 lindexi 2019-11-29 08:41: ...
- 查个远程桌面是否开启 debug版360报毒 release 不报毒
360 真tm流氓一个
- webpack 热更新
1.安装webpack npm install webpack -g //全局安装 npm install webpack --save-dev //开发环境 2.使用webpack 创建一个we ...
- 深入理解vue 修饰符sync
[ vue sync修饰符示例] 在说vue 修饰符sync前,我们先看下官方文档:vue .sync 修饰符,里面说vue .sync 修饰符以前存在于vue1.0版本里,但是在在 2.0 中移除了 ...
- 【JSOI2014】歌剧表演
题目 分析 我们抽象的认为一些不能互相辨认的人,被分到了一个集合,每当又有一场演出,就将每个出演的演员扔出集合,再将上次在相同集合的分在同一集合. 然后修改被分的集合和被新创建的时间,当集合只有一个数 ...
- 【NOIP2016提高组day1】换教室
题目 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的 课程. 在可以选择的课程中,有 2n 节课程安排在 n 个时间段上. 在第 i ( 1 ≤ i ≤ n )个 时间段上,两 ...
- 【shell】文本按行逆序
1.最简单的方法是使用tac [root ~]$ seq |tac 2.使用tr和awk. tr把换行符替换成自定义的分隔符,awk分解替换后的字符串,并逆序输出 [root ~]$ seq | tr ...
- 016:URL命名与反转URL
为什么需要URL命名? 主要解决蛋疼url变化情况,比如:哪天项目经理或领导过来说,把login改成signin,把register改成signup等蛋疼的需求——因为一旦改了url后,相关视图函数里 ...
- 微信公众号发送告警Python脚本
调用该脚本,可以向微信公众号发生告警. #!/bin/env python #coding:utf-8 #Author: Hogan #Descript : 微信公众号发送告警脚本 import ur ...
- angular-seed — AngularJS种子项目
AngularJS Seed 是典型 AngularJS web 应用的应用骨架,可以快速启动你的 AngularJS webapp 项目和这些项目的开发环境. AngularJS Seed 包括一个 ...