2021-7-8 LeetCode
阿新 • • 發佈:2021-07-20
合併兩個有序陣列
給你兩個有序整數陣列 nums1
和 nums2
,請你將 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--]; } }
只出現一次的數字
給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
要求: 時間複雜度為線性,不使用額外空間
想了好一會,線性還不使用額外空間。想不出來,點開評論區,看見位運算,異或,瞬間明白。感嘆自己太菜了。
以下為思路:
一數字異或自己結果為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; }