iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
自我挑戰組

leetcode解題學習java系列 第 5

30天LeetCode挑戰紀錄-DAY5. Product of Array Except Self

  • 分享至 

  • xImage
  •  

題目

https://ithelp.ithome.com.tw/upload/images/20250919/20178158ChFjmOOrcm.png

他說他會給一個都是整數的陣列,然後我們要找到的就是除了i之外的所有元素乘積,他還給我們兩個條件:

  1. 不能用除法
  2. 時間複雜度為O(n)

想法

我本來想說可以全部先乘起來,然後看i是第幾個就把他除掉的,但因為題目給的條件所以我們不能這樣做。
因為我對時間複雜度其實不知道是怎麼算的,所以我又覺得可以當輪到i的時候就先把i拿掉然後再一起乘,我就問了ChatGPT我這個想法是可行的嗎,它就跟我說這樣的話時間複雜度會變成O(n²),因為我要重新跑一個O(n)的迴圈。
https://ithelp.ithome.com.tw/upload/images/20250919/20178158kY20HAyXQr.png

後來Chat GPT提示我可以左右乘積分開算最後再一起乘起來,所以我就想設兩個變數分別存左邊的乘積和右邊的乘積,然後最後相乘並回傳answer。

程式碼

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        int[] left = new int[n];
        int[] right = new int[n];
        int[] answer = new int[n];

        // 左邊乘積
        left[0] = 1; // nums[0]左邊沒有數字 所以設1
        for (int i = 1; i < n; i++) {
            left[i] = left[i - 1] * nums[i - 1];
        }

        // 右邊乘積
        right[n - 1] = 1; 
        for (int i = n - 2; i >= 0; i--) {
            right[i] = right[i + 1] * nums[i + 1];
        }

        // 左右邊相乘
        for (int i = 0; i < n; i++) {
            answer[i] = left[i] * right[i];
        }

        return answer;
    }
}

程式碼執行成功
https://ithelp.ithome.com.tw/upload/images/20250919/20178158aHi5luiBta.png


上一篇
30天LeetCode挑戰紀錄-DAY4. Majority Element I/II
下一篇
30天LeetCode挑戰紀錄-DAY6. Maximum Subarray
系列文
leetcode解題學習java9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言