1. 程式人生 > 其它 >移動所有球到每個盒子所需的最小運算元

移動所有球到每個盒子所需的最小運算元

題目

有 n 個盒子。給你一個長度為 n 的二進位制字串 boxes ,其中 boxes[i] 的值為 '0' 表示第 i 個盒子是 空 的,而 boxes[i] 的值為 '1' 表示盒子裡有 一個 小球。

在一步操作中,你可以將 一個 小球從某個盒子移動到一個與之相鄰的盒子中。第 i 個盒子和第 j 個盒子相鄰需滿足 abs(i - j) == 1 。注意,操作執行後,某些盒子中可能會存在不止一個小球。

返回一個長度為 n 的陣列 answer ,其中 answer[i] 是將所有小球移動到第 i 個盒子所需的 最小 運算元。

每個 answer[i] 都需要根據盒子的 初始狀態 進行計算。

示例 1:

輸入:boxes = "110"
輸出:[1,1,3]
解釋:每個盒子對應的最小運算元如下:

  1. 第 1 個盒子:將一個小球從第 2 個盒子移動到第 1 個盒子,需要 1 步操作。
  2. 第 2 個盒子:將一個小球從第 1 個盒子移動到第 2 個盒子,需要 1 步操作。
  3. 第 3 個盒子:將一個小球從第 1 個盒子移動到第 3 個盒子,需要 2 步操作。將一個小球從第 2 個盒子移動到第 3 個盒子,需要 1 步操作。共計 3 步操作。
    示例 2:

輸入:boxes = "001011"
輸出:[11,8,5,4,3,4]

來源:力扣(LeetCode)
連結:https://leetcode.cn/problems/minimum-number-of-operations-to-move-all-balls-to-each-box


著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:雙迴圈

public static int[] minOperations(String boxes) {
        int[] answer= new int[boxes.length()];
        for (int i = 0; i < boxes.length(); i++) {
            int val = 0;
            for (int j = 0; j < boxes.length(); j++) {
                if (j == i || boxes.charAt(j) == '0') {
                    continue;
                }
                val = val + Math.abs(j - i);
            }
            answer[i]=val;
        }
        return answer;
    }

解法二:

  • 解題思路:
    當前單元格所需要移動過來的次數等於左邊移動過來的次數加上右面移動過來的次數。
  public static int[] minOperations2(String boxes) {
        int[] answer= new int[boxes.length()];
        int[] left= new int[boxes.length()];
        int[] right= new int[boxes.length()];
        int operation =0;
        if(answer.length<=1)
        {
            return answer;
        }
        for (int i = 1; i < left.length; i++) {
            if(boxes.charAt(i-1)=='1')
            {
                operation=operation+1;
            }
            left[i]=operation+left[i-1];
        }
        operation=0;
        for (int i = right.length-2; i >= 0; i--) {
            if(boxes.charAt(i+1)=='1')
            {
                operation=operation+1;
            }

            right[i]=operation+right[i+1];
            answer[i]=left[i]+right[i];
        }
        answer[answer.length-1]=left[left.length-1];
        return answer;
    }