【Leetcode】Rotate Array

数组旋转的三种方法
本文介绍了LeetCode上的一道经典题目——数组旋转的三种不同实现方式。第一种使用额外数组,空间复杂度O(n);第二种通过两次反转操作实现原地旋转,空间复杂度O(1);第三种直接平移元素,同样达到O(1)的空间复杂度。

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

题目:

Rotate an array of n elements to the right by k steps.

For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.

Hint:
Could you do it in-place with O(1) extra space?
思路:
1、用另一个数组保存,空间复杂度为O(n),时间复杂度为O(n)
2、两边逆序,整个数组逆序。空间复杂度O(1),时间复杂度O(n)
3、数组平移,往右移动一个将覆盖的元素赋给最左开始的元素。空间复杂度为O(1),时间复杂度为O(n)
算法1:
	public void rotate(int[] nums, int k) {
		if (k > nums.length) {
			k = k % nums.length;
		}
		int tmp[] = (int[]) nums.clone();
		for (int i = 0; i < k; i++) {
			nums[i] = tmp[tmp.length - k + i];
		}
		for (int i = 0; i < (tmp.length - k); i++) {
			nums[k + i] = tmp[i];
		}
	}

算法2:
	public void rotate(int[] nums, int k) {
		k = k % nums.length;
		nums = reverse(nums, 0,  nums.length-k-1);
		nums = reverse(nums,  nums.length-k,nums.length-1);
		nums = reverse(nums, 0, nums.length-1);
	}
	
	public  int [] reverse(int[] arr, int left, int right){
		if(arr == null || arr.length == 1) 
			return arr;
		for(int i=0;i<(right-left+1)/2;i++){
			int tmp = arr[left+i];
			arr[left+i] = arr[right-i];
			arr[right-i] = tmp;
		}
		return arr;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值