Leetcode刷題之路(81-90)

88.合併兩個有序數組

合併兩個有序數組題目鏈接

  • 方法挺多了
  • 方法一,最最常見的方法,效率最不高的方法,遍歷兩個數組,遇到數組2小於數組1的,就把數組1往後移動,這個位置上插入數組2的這個值
public void merge(int[] nums1, int m, int[] nums2, int n) {
        int index1=0,index2=0;
        int len = m+n;
        while(index2<n){
            while(index1<m&&nums1[index1]<=nums2[index2]){
                index1++;
            }
            if(index1>m){
                for(int i=index2;i<n;i++){
                    nums1[index1++]=nums2[i];
                }
                break;
            }
            for(int i=len-2;i>=index1;i--){
                nums1[i+1]=nums1[i];
            }
            nums1[index1]=nums2[index2++];
            m++;
        }
    }
  • 方法二,倒起遍歷,把數組2的直接插入數組1中,排個序
public void merge(int[] nums1, int m, int[] nums2, int n) {
        int count = 0;
         for(int i=m+n-1;count<n;i--){
             nums1[i]=nums2[count++];
         }
        Arrays.sort(nums1);
    }
  • 方法三,可以採用尾插法,因爲數組1後邊全都是0,遍歷兩個數組,最大的排最後邊。最後有可能會出現一種情況,那就是數組1遍歷完還剩數組2沒遍歷完,說明數組2剩下的數都比數組1小(數組2遍歷完,數組1沒遍歷完,就相當於已經把數組2的數按從大到小的數據插入進來了,不需要添加什麼東西)
public void merge(int[] nums1, int m, int[] nums2, int n) {
        int len = m+n-1;
         m--;
         n--;
         while(m>=0&&n>=0){
             nums1[len--]=nums1[m]<nums2[n]?nums2[n--]:nums1[m--];
         }
         while(n>=0){
             nums1[len--]=nums2[n--];
         }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章