1. 程式人生 > 其它 >LeetCode0088-合併兩個有序陣列

LeetCode0088-合併兩個有序陣列

技術標籤:LeetCode資料結構leetcode演算法java合併兩個有序陣列

LeetCode0088-合併兩個有序陣列

題目:

給你兩個有序整數陣列 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]

提示:

-10^9 <= nums1[i], nums2[i] <= 10^9
nums1.length == m + n
nums2.length == n

程式碼:

import java.util.Arrays;

/**
 * 0088-合併兩個有序陣列
 * <p>
 * 給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成為一個有序陣列。
 * <p>
 * 說明:
 * <p>
 * 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。
 * 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。
 * <p>
 * 示例:
 * <p>
 * 輸入:
 * nums1 = [1,2,3,0,0,0], m = 3
 * nums2 = [2,5,6],       n = 3
 * <p>
 * 輸出:[1,2,2,3,5,6]
 * <p>
 * 提示:
 * <p>
 * -10^9 <= nums1[i], nums2[i] <= 10^9
 * nums1.length == m + n
 * nums2.length == n
 */
/** * 雙指標從後往前移動 */ class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { // 第一個陣列最後一個元素下標 int p1 = m - 1; // 第二個陣列最後一個元素下標 int p2 = n - 1; // 設定目標陣列的元素放置索引 int p = m + n - 1; // 當倆個數組有元素時候 while ((p1 >= 0) &&
(p2 >= 0)){ nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--]; } // 新增剩餘元素--只需要新增nums2 的原因是nums1 為源陣列,如果剩餘元素不需要進行重複新增 System.arraycopy(nums2, 0, nums1, 0, p2 + 1); } } /** * 測試 */ public class Study0088 { public static void main(String[] args) { int[] nums1 = {1, 2, 3, 0, 0, 0}; int[] nums2 = {2, 5, 6}; new Solution().merge(nums1, 3, nums2, 3); System.out.println(Arrays.toString(nums1)); } }

結果:

在這裡插入圖片描述