1. 程式人生 > 其它 >2021-7-8 LeetCode

2021-7-8 LeetCode

合併兩個有序陣列

88. 合併兩個有序陣列 - 力扣(LeetCode) (leetcode-cn.com)

給你兩個有序整數陣列 nums1nums2,請你將 nums2 合併到 nums1使 nums1 成為一個有序陣列。

初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。你可以假設 nums1 的空間大小等於 m + n,這樣它就有足夠的空間儲存來自 nums2 的元素。

輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
輸出:[1,2,2,3,5,6]

使用逆向雙指標,用兩個指標記錄兩個陣列的座標,從最後開始讀(nums1後全為0,從後開始寫入不會覆蓋掉已有的值)

public void merge(int[] nums1, int m, int[] nums2, int n) {
    int h1 = m - 1, h2 = n - 1;
    int p = m + n - 1;
    while (h1 >= -1 && h2 >= 0) {
        if (h1 == -1 || nums1[h1] <= nums2[h2])
            nums1[p--] = nums2[h2--];
        else
            nums1[p--] = nums1[h1--];
    }
}

只出現一次的數字

136. 只出現一次的數字 - 力扣(LeetCode) (leetcode-cn.com)

給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

要求: 時間複雜度為線性,不使用額外空間

想了好一會,線性還不使用額外空間。想不出來,點開評論區,看見位運算,異或,瞬間明白。感嘆自己太菜了。

以下為思路:

一數字異或自己結果為0,a^a = 0,除了我們要找的數字外 其餘數字都出現了兩次,那麼把所有數字都異或一遍,成對出現的數字都會被消去,最後只剩下我們要找的數字。 例如 1,1,2 1 ^ 1 = 0, 0 ^ 2 = 2

public int singleNumber(int[] nums) {
    int res = nums[0];
    for (int i = 1; i < nums.length; i ++) {
        res = nums[i] ^ res;
    }
    return res;
}