日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 88合并两个有序数组89格雷编码

發布時間:2025/3/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 88合并两个有序数组89格雷编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

微信搜一搜:bigsai 專注于Java、數據結構與算法,一起進大廠不迷路!
算法文章題解全部收錄在github倉庫bigsai-algorithm,求star!
關注回復進群即可加入力扣打卡群,歡迎劃水。近期打卡:
Leetcode 76最小覆蓋子串&77組合&78子集
LeetCode 79單詞搜索&80刪除排序數組中的重復項Ⅱ&81.搜索旋轉排序數組Ⅱ
LeetCode 86分割鏈表&87擾亂字符串
如有幫助,記得一鍵三連

合并兩個有序數組

題目描述

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

這題的思路很多,你可以先拼接到num1數組然后排序。但是這個并不是特別好的方法。

首先,數組是有序的,第一個方式可以借助一個新的數組實現一趟歸并的過程。然后將數據挨個復制到num1數組中。

實現代碼為:

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int index1=0;int index2=0;int a[]=new int[m+n];while (index1<m&&index2<n) {if(nums1[index1]<=nums2[index2]){a[index1+index2]=nums1[index1];index1++;}else {a[index1+index2]=nums2[index2];index2++;}}for(;index1<m;index1++){a[index1+index2]=nums1[index1];}for(;index2<n;index2++){a[index1+index2]=nums2[index2];}for(int i=0;i<m+n;i++){nums1[i]=a[i];}} }

但這種方法并不是很好,浪費的空間較多,空間怎么復用呢?

  • 如果歸并直接在sum1數組歸并的話那么會出現錯誤(前面數字可能未來得及處理就被覆蓋)。
  • 所以這里可以從后向前進行歸并啊!后面的區域一定是可以滿足使用的。


實現代碼為:

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int index1=m-1;int index2=n-1;while (index1>=0&&index2>=0) {if(nums1[index1]>=nums2[index2]){nums1[index1+index2+1]=nums1[index1--];}else {nums1[index1+index2+1]=nums2[index2--];}}for(;index2>=0;index2--){nums1[index2]=nums2[index2];}} }

格雷編碼


分析
本題的話是個思維題,思想上是個貪心的思想,首先我們要分析這個數值上的關系:

  • 每次二進制只能有一位的不同。
  • 每個位上有0,1
  • 需要考慮進位問題

如果只有一位,那肯定是0,1沒問題,大部分開始從0開始也沒問題,問題是我們怎么采取什么樣方式或者策略能夠讓滿足每次只有一個數位不同呢?

  • 復用以前的不同
  • 迭代

其實這題就是每次需要考慮進位的時候,數值進位的時候前面加個1,然后從最后一個數字到第一個數字疊加到新的集合中,每進一位就要這樣迭代一次,所以數據量每次都以二倍形式增加,具體的話通過一張圖就能看懂了。


這其實就是推導n-1個和n個數集合數字之間的關系。

  • 如果n-1位集合里面數字兩兩相差為1個不同。
  • 那么n位的首先首位為0的就是n-1個數字的序列能保證。
  • n位首位為1的就是n-1位從后向前迭代相加(首位為1)

所以在具體迭代的時候就是從后向前每個數加2n 放到集合中即可。
實現代碼為:

class Solution {public List<Integer> grayCode(int n) {List<Integer>list=new ArrayList<Integer>();list.add(0);int num=1;for(int i=0;i<n;i++){int size=list.size();for(int j=size-1;j>=0;j--){list.add(list.get(j)+num);}num=num<<1; }return list;} }

ps:加上2n 并且前面的數這個位為0,所以可以使用位運算|操作就是得到相加的結果。并且這里可以根據size規律直接增加,但是為了通俗易懂這里不改了。

結語

原創不易,bigsai請你幫兩件事幫忙一下:

  • star支持一下, 您的肯定是我在平臺創作的源源動力。

  • 微信搜索「bigsai」,關注我的公眾號,不僅免費送你電子書,我還會第一時間在公眾號分享知識技術。加我還可拉你進力扣打卡群一起打卡LeetCode。

  • 記得關注、咱們下次再見!

    總結

    以上是生活随笔為你收集整理的LeetCode 88合并两个有序数组89格雷编码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。