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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

去除有序数组/链表的重复元素--双指针原地修改

發布時間:2024/4/11 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 去除有序数组/链表的重复元素--双指针原地修改 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

去除有序數組的重復元素–雙指針原地修改

文章目錄

    • 去除有序數組的重復元素--雙指針原地修改
    • 一、題目描述
    • 二、分析
    • 三、代碼:數組
    • 四、代碼:鏈表

一、題目描述

二、分析

  • 顯然,由于數組已經排序,所以重復的元素一定連在一起,找出它們并不難,但如果毎找到一個重復元素就立即刪除它,就是在數組中間進行刪除操作,整個時間復雜度是會達到O(N^2)。而且題目要求我們原地修改,也就是說不能用輔助數組,空間復雜度得是 O(1)。
  • 其實,對于數組相關的算法問題,有一個通用的技巧:要盡量避免在中間刪除元素,那我就想先辦法把這個元素換到最后去。這樣的話,最終待刪除的元素都拖在數組尾部,一個一個 pop 掉就行了,每次操作的時間復雜度也就降低到 O(1) 了。
  • 按照這個思路呢,又可以衍生出解決類似需求的通用方式:雙指針技巧。具體一點說,應該是快慢指針。
  • 我們 讓慢指針 slow 走左后面,快指針 fast 走在前面探路,找到一個不重復的元素就告訴 slow 并讓 slow 前進一步。這樣當 fast 指針遍歷完整個數組 nums 后,nums[0..slow] 就是不重復元素,之后的所有元素都是重復元素

三、代碼:數組

int removeDuplicates(int[] nums) {int n = nums.length;if (n == 0) return 0;int slow = 0, fast = 1;while (fast < n) {if (nums[fast] != nums[slow]) {slow++;// 維護 nums[0..slow] 無重復nums[slow] = nums[fast];}fast++;}// 長度為索引 + 1return slow + 1; }

四、代碼:鏈表

給你一個有序鏈表,如何去重呢?其實和數組是一模一樣的,唯一的區別是把數組賦值操作變成操作指針而已:

ListNode deleteDuplicates(ListNode head) {if (head == null) return null;ListNode slow = head, fast = head.next;while (fast != null) {if (fast.val != slow.val) {// nums[slow] = nums[fast];slow.next = fast;// slow++;slow = slow.next;}// fast++fast = fast.next;}// 斷開與后面重復元素的連接slow.next = null;return head; }

總結

以上是生活随笔為你收集整理的去除有序数组/链表的重复元素--双指针原地修改的全部內容,希望文章能夠幫你解決所遇到的問題。

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