當前位置:
首頁 >
去除有序数组/链表的重复元素--双指针原地修改
發布時間: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; }總結
以上是生活随笔為你收集整理的去除有序数组/链表的重复元素--双指针原地修改的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二分查找的应用
- 下一篇: 最长回文子串和回文链表