Leetcode - Rotate Array

Yuni·2023년 8월 24일
0

Algorithm

목록 보기
21/27
post-thumbnail

Problem

Given an integer array nums, rotate the array to the right by k steps, where k is non-negative.

 

Example 1:

Input: nums = [1,2,3,4,5,6,7], k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]

Example 2:

Input: nums = [-1,-100,3,99], k = 2
Output: [3,99,-1,-100]
Explanation: 
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]

 

Constraints:

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

 

Follow up:

  • Try to come up with as many solutions as you can. There are at least three different ways to solve this problem.
  • Could you do it in-place with O(1) extra space?

Approach 1 (Time Limit Exceeded)

EN

KR

k번 만큼 도는데, 만약 배열 길이가 2인 배열에서 2번 돌면 도는게 의미가 없기 때문에 반복횟수인 rotations 을 선언하고 반복 횟수인 k와 nums배열의 길이의 나머지를 대입한다.
rotations가 0이라면 즉, 나머지가 없다면 바로 들어온 배열을 리턴한다.
그렇지 않다면 로테이션만큼 반복해야하므로 이중 포문으로 구성해 irotations만큼 반복 대신 안의 nums 배열은 전부 다 돌아야 하므로 안쪽의 jnums.length만큼 반복해 돌면서 배열의 마지막 원소를 last에 넣어주고 해당 last를 unshift를 이용하여 배열 앞에 삽입, pop을 이용해 삽입한 만큼 배열 뒤에서 제거해준다.

❗로직은 통했으나 시간초과로 실패!

code

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
let last;

const rotations = k % nums.length;

if (rotations === 0) {
  return;
}
    
for(let i=1; i<=rotations; i++) {
  for(let j=0; j<nums.length; j++) {
    last = nums.at(-1);
  }
  nums.unshift(last);
  nums.pop(); 
} 


Approach 2 (Accepted)

EN

KR

k번 만큼 도는데, 만약 배열 길이가 2인 배열에서 2번 돌면 도는게 의미가 없기 때문에 반복횟수인 rotations 을 선언하고 반복 횟수인 k와 nums배열의 길이의 나머지를 대입한다.
rotations가 0이라면 즉, 나머지가 없다면 바로 들어온 배열을 리턴한다.
=> 해당 부분은 동일하게 진행했다.

새로운 빈 배열을 선언한 뒤 배열 길이에서 로테이션(반복해야하는 만큼)의 길이만큼 자른다.
해당 자른 배열을 기준으로 뒤에있는 원소들(nums[nums.length-rotations]부터 nums.at(-1))을 arr에 먼저 붙여넣고, 앞에있는 원소들(nums[0]부터 nums[nums.length-rotations-1]) 순서로 빈 배열의 값으로 덮어씌운다.

마지막으로 nums배열을 arr배열로 덮어씌워 nums배열을 변경한다.

code

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    const rotations = k % nums.length;
    
  	if (rotations === 0) {
        return;
    }

    let arr = [];
  
    for(let j=nums.length-rotations; j<nums.length; j++) {
        arr.push(nums[j]);
    }
    for(let j=0; j<nums.length-rotations; j++) {
        arr.push(nums[j]);
    }

    for (let i=0; i<nums.length; i++) {
        nums[i]=arr[i];
    }
    
};
profile
Look at art, make art, show art and be art. So does as code.

0개의 댓글