สมมติว่าเรามีหมายเลขอาร์เรย์ที่เรียงลำดับแล้ว เราต้องลบรายการที่ซ้ำกันออกเพื่อให้องค์ประกอบที่ซ้ำกันปรากฏอย่างมากที่สุดสองครั้งและส่งคืนความยาวใหม่ ในการทำงานนี้เราไม่สามารถใช้พื้นที่พิเศษได้ เราต้องแก้ปัญหานี้ด้วยพื้นที่ O(1) ตัวอย่างเช่น ถ้าอาร์เรย์เป็นเหมือน [0,0,0,1,1,1,1,2,3,3] ผลลัพธ์จะเป็น [0,0,1,1,2,3,3] , ยาว 7
ให้เราดูขั้นตอน -
- len :=2 และ n :=ขนาดของอาร์เรย์
- ถ้า n <=2 ให้คืนค่า n
- สำหรับ i :=2 ถึง n
- ถ้า nums[i] !=nums[len - 2] หรือ nums[i] !=nums[len - 1]
- nums[len] :=nums[i] และเพิ่ม len ขึ้น 1
- ถ้า nums[i] !=nums[len - 2] หรือ nums[i] !=nums[len - 1]
- คืนเลน
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int removeDuplicates(vector<int>& nums) { int len = 2; int n = nums.size(); if(n <= 2)return n; for(int i = 2; i < n; i++){ if( nums[i] != nums[len - 2] || nums[i] != nums[len - 1]){ nums[len] = nums[i]; len++; } } return len; } }; main(){ Solution ob; vector<int> v = {0,0,0,1,1,1,1,2,3,3}; cout << ob.removeDuplicates(v); }
อินพุต
[0,0,0,1,1,1,1,2,3,3]
ผลลัพธ์
7