Tác giả: Lê Trung Kiên lớp java 08
Email: lekien.2803.cg@gmail.com
SĐT: 0942096947
Link bài toán: https://leetcode.com/problems/flipping-an-image/description/

1.Mở đầu

Xin chào các bạn, mình viết ra bài viết này để chia sẻ phương pháp giải cũng như tư duy của mình về bài toán này của leetcode. Phương pháp của mình có thể không phải là tối ưu nhất, tuy nhiên mình sẽ phân tích, chia nhỏ bài toán ra thành các module nhỏ hơn để dễ giải quyết cũng như giúp các bạn hiểu được các yêu cầu mà bài toán đưa ra.

2. Đề bài

Cho bạn một ma trận nhị phân kích thước n x n tên là image, hãy lật hình ảnh theo chiều ngang, sau đó đảo ngược nó rồi trả về kết quả.
Lật hình ảnh theo chiều ngang, nghĩa là mỗi hàng của image được đảo ngược.

  • Ví dụ: Lật [1,1,0] thì sẽ được [0,1,1]
    Đảo ngược hình ảnh có nghĩa là mỗi số 0 được thay thế bằng 1 và mỗi số 1 được thay thế bằng 0.
  • Ví dụ: đảo ngược[0,1,1] sẽ được [1,0,0]

Bài toán minh họa:

Input: image = [[1,1,0],[1,0,1],[0,0,0]]
Output: [[1,0,0],[0,1,0],[1,1,1]]
Explanation: First reverse each row: [[0,1,1],[1,0,1],[0,0,0]].
Then, invert the image: [[1,0,0],[0,1,0],[1,1,1]]

3. Phân tích

Ok đề bài này cũng không quá phức tạp, họ yêu cầu chúng ta phải lật và đảo số của mỗi hàng trong ma trận có tên image. Vậy thì chúng ta sẽ chia bài toán ra làm hai module nhỏ là Lật và Đảo.
Ở phần Lật hình ảnh, chúng ta sẽ thực hiện công việc lật từng hàng trong ma trận của image rồi trả về mảng đã lật.
Sau đó đến phần Đảo hình ảnh, chúng ta sẽ đảo những giá trị có trong mảng đã lật ở phần trên.
Thế là xong!

4. Code thôi chờ gì nữa

Đầu tiên chúng ta sẽ tạo ra một function có nhiệm vụ Lật hình ảnh, đầu vào sẽ là một hàng trong ma trận image, mà mỗi hàng trong ma trận là một mảng kiểu int nên ta sẽ viết như sau:

 public int[] flipImage(int[] image){
        int n = image.length;
        int[] res = new int[n]; // Tạo ra mảng mới để chứa kết quả hình ảnh đã lật
        int k = 0;

        for (int i = n - 1; i >= 0; i--) {
            res[k] = image[i]; 
            k++;
        }
        return res;
}

Tiếp theo chúng ta sẽ tạo ra function có chức năng Đảo hình ảnh, đầu vào sẽ là mảng int đã được lật ở trên, nếu là số 0 thì đổi thành 1 và ngược lại:

public int[] invertImage(int[] image){
        for (int i = 0; i < image.length; i++) {
            if (image[i] == 0) {
                image[i] = 1;
            }else{
                image[i] = 0;
            }
        }
        return image;
}

Sau khi có hai function trên, ta hoàn thành nốt yêu cầu bài toán và trả về kết quả:

class Solution {
    public int[][] flipAndInvertImage(int[][] image) {
        int row = image.length;
        for (int i = 0; i < row; i++) {
            image[i] = flipImage(image[i]);
        }

        for (int i = 0; i < row; i++) {
            invertImage(image[i]);
        }

        return image;
    }

    public int[] flipImage(int[] image){
        int n = image.length;
        int[] res = new int[n];
        int k = 0;

        for (int i = n - 1; i >= 0; i--) {
            res[k] = image[i];
            k++;
        }
        return res;
    }

    public int[] invertImage(int[] image){
        for (int i = 0; i < image.length; i++) {
            if (image[i] == 0) {
                image[i] = 1;
            }else{
                image[i] = 0;
            }
        }
        return image;
    }
}

5. Kết thúc

Qua bài viết này, mình đã chia sẻ cho các bạn cách mình tư duy khi giải bài tập trên leetcode. Hi vọng bài viết giúp ích cho các bạn trong cách tư duy để giải các bài tập khác. Xin cám ơn các bạn đã dành thời gian đọc và theo dõi.