LeetCode 문제 풀이 기록 (15 일 째)
원래 제목:
In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new one with different size but keep its original data.
You're given a matrix represented by a two-dimensional array, and two positive integers r and c representing the row number and column number of the wanted reshaped matrix, respectively.
The reshaped matrix need to be filled with all the elements of the original matrix in the same row-traversing order as they were.
If the 'reshape' operation with given parameters is possible and legal, output the new reshaped matrix; Otherwise, output the original matrix.
번역:
MATLAB 에서 매우 유용 한 함 수 를 'reshape' 라 고 부 릅 니 다. 행렬 을 서로 다른 크기 의 새 행렬 로 재 구성 할 수 있 지만 원본 데 이 터 를 유지 할 수 있 습 니 다.
2 차원 배열 로 표 시 된 행렬 과 두 개의 정수 r 와 c 가 각각 원 하 는 재 구성 행렬 의 줄 번호 와 열 번 호 를 표시 합 니 다.
재 구성 한 행렬 은 원본 행렬 의 모든 요 소 를 같은 줄 로 옮 겨 다 니 며 순서대로 채 워 야 합 니 다.
주어진 매개 변 수 를 가 진 '재 구축' 작업 이 가능 하고 합 법 적 이면 새로운 재 구축 행렬 을 출력 합 니 다. 그렇지 않 으 면 원본 행렬 을 출력 합 니 다.
사례:
Example 1:
Input:
nums =
[[1,2],
[3,4]]
r = 1, c = 4
Output:
[[1,2,3,4]]
Explanation:
The row-traversing of nums is [1,2,3,4]. The new reshaped matrix is a 1 * 4 matrix, fill it row by row by using the previous list.
Example 2:
Input:
nums =
[[1,2],
[3,4]]
r = 2, c = 4
Output:
[[1,2],
[3,4]]
Explanation:
There is no way to reshape a 2 * 2 matrix to a 2 * 4 matrix. So output the original matrix.
생각:
오늘 이 문 제 는 비교적 간단 한 문제 입 니 다. 아마도 최근 에 계속 문 제 를 풀 고 있 는 것 이 효과 가 있 을 것 입 니 다. 헤헤.제목 은 사례 에 맞 춰 이해 하기 쉽다. 바로 원래 의 2 차원 배열 안의 모든 요 소 를 꺼 내 새로운 차원 의 2 차원 배열 을 구성 하 는 것 이다.
1. 먼저 새로운 2 차원 배열 을 구성 할 수 있 는 지 판단 하고 Example 2 와 같이 만약 에 안 되면 원래 의 배열 로 돌아 가 야 한다.
2. 배열 에 들 어 가 는 모든 요 소 를 옮 겨 다 니 며 새로운 2 차원 배열 에 순서대로 넣 습 니 다.
3. 새로운 2 차원 배열 의 크기 는 전송 r 와 c 로 정의 해 야 합 니 다.
4. if else 를 통 해 새로운 배열 에 넣 는 위 치 를 판단 하고 경계 판단 을 잘 하여 배열 이 경 계 를 넘 지 않도록 해 야 합 니 다.
5. 새 배열 이 느 려 지면 새 배열 로 돌아 갑 니 다.
이해 하기 쉽 지만 세기 의 인 코딩 에서 저도 여러 가지 사례 의 테스트 를 통 해 많은 상황 을 테스트 하고 제 코드 를 완 선 했 습 니 다. 다음은 제 가 작성 한 코드 입 니 다.
package com.mianshi.suanfa.ReshapetheMatrix;
/**
* Created by macbook_xu on 2018/4/4.
*/
public class Solution {
public static int[][] matrixReshape(int[][] nums, int r, int c) {
if (nums.length * nums[0].length < r * c) return nums;
int[][] newNums = new int[r][c];
int count = 0 ;
int row = 0 ;
int con = 0 ;
for (int i = 0 ; ir-1) return newNums;
newNums[row][con] = nums[i][j];
con++;
count = 1 ;
}
}
}
return newNums;
}
public static void main(String[] args) {
int[][] nums = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int[][] newNums = matrixReshape(nums,4,2);
for (int i = 0 ; i
완전히 자신의 생각 대로 작 성 했 습 니 다. 이렇게 하 는 것 이 효율 에 영향 을 미 칠 지 는 모 르 겠 지만 이것 은 제 가 생각 할 수 있 는 가장 완벽 한 해결 방법 입 니 다.사실은 홈 페이지 에서 원래 의 배열 요소 의 개수 가 새로운 배열 요소 의 개수 와 같 지 않 을 때 모두 원래 의 배열 로 돌아 가 야 한다 고 생각 합 니 다. 그러나 저 는 이 문 제 는 원래 의 배열 요소 의 개수 가 새로운 배열 요소 의 개수 보다 많 을 때 도 바 꿀 수 있다 고 생각 합 니 다. 만약 에 문 제 를 통과 하기 위해 처음에 판단 조건 이 다 르 게 바 뀌 었 다 고 생각 합 니 다. 사실은 이런 세부 사항 은 업무 수행 에서 주로 업무 수 요 를 볼 수 있 습 니 다.
물론 답 에서 도 몇 가지 방법 을 제시 했다.
방법
public class Solution {
public int[][] matrixReshape(int[][] nums, int r, int c) {
int[][] res = new int[r][c];
if (nums.length == 0 || r * c != nums.length * nums[0].length)
return nums;
int count = 0;
Queue < Integer > queue = new LinkedList < > ();
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[0].length; j++) {
queue.add(nums[i][j]);
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
res[i][j] = queue.remove();
}
}
return res;
}
}
방법
public class Solution {
public int[][] matrixReshape(int[][] nums, int r, int c) {
int[][] res = new int[r][c];
if (nums.length == 0 || r * c != nums.length * nums[0].length)
return nums;
int rows = 0, cols = 0;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[0].length; j++) {
res[rows][cols] = nums[i][j];
cols++;
if (cols == c) {
rows++;
cols = 0;
}
}
}
return res;
}
}
방법
public class Solution {
public int[][] matrixReshape(int[][] nums, int r, int c) {
int[][] res = new int[r][c];
if (nums.length == 0 || r * c != nums.length * nums[0].length)
return nums;
int count = 0;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[0].length; j++) {
res[count / c][count % c] = nums[i][j];
count++;
}
}
return res;
}
}
사실 방법 은 하나 와 둘 다 제 생각 과 차이 가 많 지 않 습 니 다. 방법 은 배열 에 들 어 오 는 모든 요 소 를 저장 하 는 대기 열 을 사 용 했 을 뿐 입 니 다. 그러나 이렇게 하면 공간 이 더 소모 되 고 방법 둘 째 는 제 기본 과 같 습 니 다. 옮 겨 다 니 면서 새로운 배열 에 값 을 부여 하고 마지막 으로 새로운 배열 로 돌아 갑 니 다.물론 방법 세 가 지 는 아주 좋 은 방법 이 라 고 생각 합 니 다. 수학의 방법 으로 판단 하면 복잡 한 조건 을 쓸 필요 가 없고 매우 효율 적 이 고 간단 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.