国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

力扣刷題:刪除重復(fù)元素

這篇具有很好參考價值的文章主要介紹了力扣刷題:刪除重復(fù)元素。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

概述

當處理排序數(shù)組時,刪除重復(fù)元素是一個常見的問題。首先,我們來看一下如何解決這個問題,然后再進一步討論如何處理允許最多重復(fù)兩次的情況。

刪除重復(fù)元素

問題描述:給定一個已排序的數(shù)組,刪除重復(fù)的元素,使得每個元素只出現(xiàn)一次,并返回新的長度。

解決思路:

使用雙指針方法。一個指針用于遍歷數(shù)組,另一個指針指向當前不重復(fù)元素應(yīng)該存放的位置。
通過比較當前元素與前一個元素是否相等,確定是否需要移動元素。

方法:

int removeDuplicates(vector<int>& nums) {
    if (nums.size() <= 1)
        return nums.size();
    
    int index = 1;
    for (int i = 1; i < nums.size(); i++) {
        if (nums[i] != nums[i - 1]) {
            nums[index] = nums[i];
            index++;
        }
    }
    
    return index;
}

刪除重復(fù)元素(允許最多重復(fù)兩次)

問題描述:給定一個已排序的數(shù)組,刪除重復(fù)的元素,使得每個元素最多只出現(xiàn)兩次,并返回新的長度。

解決思路:

仍然使用雙指針方法,但需要進行一些額外的判斷。
使用一個計數(shù)器來記錄當前元素的重復(fù)次數(shù),控制重復(fù)次數(shù)不超過兩次。由于代碼本身已經(jīng)排序,所以只需要使用一個計數(shù)器,否則需要使用哈希表

解決方法:

int removeDuplicates(vector<int>& nums) {
    if (nums.size() <= 2)
        return nums.size();
    
    int index = 2;
    int count = 1;
    for (int i = 2; i < nums.size(); i++) {
        if (nums[i] != nums[index - 1]) {
            nums[index] = nums[i];
            index++;
            count = 1;
        } else if (count < 2) {
            nums[index] = nums[i];
            index++;
            count++;
        }
    }
    
    return index;
}

如果數(shù)組無序

如果數(shù)組不是有序的,并且要求刪除重復(fù)元素的同時保持原來的順序,可以使用哈希表來解決這個問題。

重復(fù)一次

下面是解決辦法的詳細步驟:

初始化一個空的哈希表來記錄已經(jīng)出現(xiàn)過的元素。
初始化一個新的數(shù)組result,用于存放不重復(fù)的元素。
遍歷原始數(shù)組,對于每個元素:
如果該元素不在哈希表中,表示遇到了一個新的不重復(fù)元素。將其添加到哈希表中,并將其添加到result數(shù)組末尾。
如果該元素已經(jīng)在哈希表中,表示遇到了重復(fù)元素,直接跳過該元素。
返回result數(shù)組的長度作為結(jié)果。
以下是使用C++實現(xiàn)的代碼示例:

#include <iostream>
#include <vector>
#include <unordered_set>

int removeDuplicates(std::vector<int>& nums) {
    std::unordered_set<int> seen;
    std::vector<int> result;
    
    for (int num : nums) {
        if (seen.find(num) == seen.end()) {
            seen.insert(num);
            result.push_back(num);
        }
    }
    
    nums = result;  // 更新原數(shù)組為不重復(fù)的結(jié)果數(shù)組
    
    return result.size();
}

int main() {
    std::vector<int> nums = {3, 1, 2, 1, 3, 2, 4};
    
    int length = removeDuplicates(nums);
    
    std::cout << "Length: " << length << std::endl;
    std::cout << "New Array: ";
    for (int num : nums) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

通過調(diào)用removeDuplicates函數(shù),可以得到去除重復(fù)元素后的新數(shù)組長度。原數(shù)組nums會被更新為只包含不重復(fù)元素的結(jié)果數(shù)組。代碼中使用了unordered_set來記錄已經(jīng)出現(xiàn)過的元素,保證了查找的時間復(fù)雜度為O(1)。

重復(fù)兩次

可以使用unordered_map來記錄每個元素的出現(xiàn)次數(shù),以實現(xiàn)刪除重復(fù)元素并保持原始順序的要求。
下面是使用unordered_map解決問題的思路和代碼:
初始化一個空的unordered_map,用于記錄每個元素的出現(xiàn)次數(shù)。
初始化一個新的數(shù)組result,用于存放不重復(fù)的元素。
遍歷原始數(shù)組,對于每個元素:
如果該元素不在unordered_map中,表示遇到了一個新的元素。將其添加到unordered_map中,并將其添加到result數(shù)組末尾。
如果該元素已經(jīng)在unordered_map中,表示遇到了重復(fù)元素。檢查該元素的出現(xiàn)次數(shù):
如果出現(xiàn)次數(shù)小于2,將其添加到unordered_map中,并將其添加到result數(shù)組末尾。
如果出現(xiàn)次數(shù)大于等于2,直接跳過該元素。
返回result數(shù)組的長度作為結(jié)果。
以下是使用C++實現(xiàn)的代碼示例:

#include <iostream>
#include <vector>
#include <unordered_map>

int removeDuplicates(std::vector<int>& nums) {
    std::unordered_map<int, int> counts;
    std::vector<int> result;
    
    for (int num : nums) {
        if (counts.find(num) == counts.end()) {
            counts[num] = 1;
            result.push_back(num);
        } else {
            if (counts[num] < 2) {
                counts[num]++;
                result.push_back(num);
            }
        }
    }
    
    nums = result;  // 更新原數(shù)組為不重復(fù)的結(jié)果數(shù)組
    
    return result.size();
}

int main() {
    std::vector<int> nums = {3, 1, 2, 1, 3, 2, 4};
    
    int length = removeDuplicates(nums);
    
    std::cout << "Length: " << length << std::endl;
    std::cout << "New Array: ";
    for (int num : nums) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

通過調(diào)用removeDuplicates函數(shù),可以得到去除重復(fù)元素后的新數(shù)組長度。原數(shù)組nums會被更新為只包含不重復(fù)元素的結(jié)果數(shù)組。在代碼中,使用unordered_map來記錄每個元素的出現(xiàn)次數(shù),并根據(jù)出現(xiàn)次數(shù)的大小判斷是否添加到結(jié)果數(shù)組中。

總結(jié)

以上是使用C++實現(xiàn)的解決方案。這兩個問題都可以通過這些代碼解決,并且時間復(fù)雜度為O(n),其中n是數(shù)組的長度。
希望這篇博文對初學者有所幫助,并能夠清晰地解釋了解決這兩個問題的思路和方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-540450.html

到了這里,關(guān)于力扣刷題:刪除重復(fù)元素的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 力扣(LeetCode)算法_C++——存在重復(fù)元素 II

    存在重復(fù)元素 II 給你一個整數(shù)數(shù)組 nums 和一個整數(shù) k ,判斷數(shù)組中是否存在兩個 不同的索引 i 和 j ,滿足 nums[i] == nums[j] 且 abs(i - j) = k 。如果存在,返回 true ;否則,返回 false 。 示例 1: 輸入:nums = [1,2,3,1], k = 3 輸出:true 示例 2: 輸入:nums = [1,0,1,1], k = 1 輸出:true 示例

    2024年02月09日
    瀏覽(25)
  • 【leetcode 力扣刷題】匯總區(qū)間//合并區(qū)間//插入?yún)^(qū)間

    【leetcode 力扣刷題】匯總區(qū)間//合并區(qū)間//插入?yún)^(qū)間

    題目鏈接:228.匯總區(qū)間 題目內(nèi)容: 看題目真是沒懂這個題到底是要干啥……實際上題目要求的 恰好覆蓋數(shù)組中所有數(shù)字 的 最小有序 區(qū)間范圍列表,這個最小是指一個區(qū)間范圍小。比如能夠覆蓋{2,3,4,6}的區(qū)間可以是[2,6],但是5在區(qū)間內(nèi),卻不在數(shù)組內(nèi),因此這個區(qū)間不是最

    2024年02月10日
    瀏覽(33)
  • leetcode 力扣刷題 旋轉(zhuǎn)矩陣(循環(huán)過程邊界控制)

    leetcode 力扣刷題 旋轉(zhuǎn)矩陣(循環(huán)過程邊界控制)

    下面的題目的主要考察點都是,二維數(shù)組從左上角開始順時針(或者逆時針)按圈遍歷數(shù)組的過程。順時針按圈遍歷的過程如下: 對于每一圈,分為四條邊 ,循環(huán)遍歷就好。這時,對于 四個角 的元素的處理,可以將四條邊的遍歷分為以下兩種情況: 第一種:每條邊都從對

    2024年02月12日
    瀏覽(21)
  • 【leetcode 力扣刷題】鏈表基礎(chǔ)知識 基礎(chǔ)操作

    【leetcode 力扣刷題】鏈表基礎(chǔ)知識 基礎(chǔ)操作

    在數(shù)據(jù)結(jié)構(gòu)的學習過程中,我們知道線性表【一種數(shù)據(jù)組織、在內(nèi)存中存儲的形式】是線性結(jié)構(gòu)的,其中線性表包括順序表和鏈表。數(shù)組就是順序表,其各個元素在內(nèi)存中是連續(xù)存儲的。 鏈表則是由 數(shù)據(jù)域 和 指針域 組成的 結(jié)構(gòu)體 構(gòu)成的,數(shù)據(jù)域是一個節(jié)點的數(shù)據(jù),指針域

    2024年02月12日
    瀏覽(22)
  • 【leetcode 力扣刷題】回文串相關(guān)題目(KMP、動態(tài)規(guī)劃)

    【leetcode 力扣刷題】回文串相關(guān)題目(KMP、動態(tài)規(guī)劃)

    題目鏈接:5. 最長回文子串 題目內(nèi)容: 題目就是要我們找s中的回文子串,還要是最長的。其實想想,暴力求解也行……就是遍歷所有的子串,同時判斷是不是回文串,是的話再和記錄的最大長度maxlen比較,如果更長就更新。時間復(fù)雜度直接變成O(n^3)。 優(yōu)化的點在于,假設(shè)子

    2024年02月09日
    瀏覽(27)
  • 【leetcode 力扣刷題】字符串匹配之經(jīng)典的KMP?。?!

    【leetcode 力扣刷題】字符串匹配之經(jīng)典的KMP?。?!

    以下是能用KMP求解的算法題,KMP是用于字符串匹配的經(jīng)典算法【至今沒學懂………啊啊啊】 題目鏈接:28. 找出字符串中第一個匹配項的下標 題目內(nèi)容: 題意還是很好理解的,要在字符串haystack中查找一個完整的needle,即字符串匹配。 暴力求解就是用 兩層循環(huán) :haystack從第

    2024年02月09日
    瀏覽(33)
  • 【leetcode 力扣刷題】字符串翻轉(zhuǎn)合集(全部反轉(zhuǎn)///部分反轉(zhuǎn))

    【leetcode 力扣刷題】字符串翻轉(zhuǎn)合集(全部反轉(zhuǎn)///部分反轉(zhuǎn))

    題目鏈接:344. 反轉(zhuǎn)字符串 題目內(nèi)容: 題目中重點強調(diào)了必須 原地修改 輸入數(shù)組,即不能新建一個數(shù)組來完成字符串的反轉(zhuǎn)。我們注意到: 原來下標為0的,反轉(zhuǎn)后是size - 1【原來下標是size - 1的,反轉(zhuǎn)后是0】; 原來下標是1的,反轉(zhuǎn)后是size - 2【原來下標是size -2的,反轉(zhuǎn)后

    2024年02月11日
    瀏覽(33)
  • 算法leetcode|83. 刪除排序鏈表中的重復(fù)元素(rust重拳出擊)

    算法leetcode|83. 刪除排序鏈表中的重復(fù)元素(rust重拳出擊)

    給定一個已排序的鏈表的頭 head , 刪除所有重復(fù)的元素,使每個元素只出現(xiàn)一次 。返回 已排序的鏈表 。 鏈表中節(jié)點數(shù)目在范圍 [0, 300] 內(nèi) -100 = Node.val = 100 題目數(shù)據(jù)保證鏈表已經(jīng)按升序 排列 面對這道算法題目,二當家的再次陷入了沉思。 本來要刪除重復(fù)元素,需要兩次遍

    2024年02月07日
    瀏覽(18)
  • 算法leetcode|82. 刪除排序鏈表中的重復(fù)元素 II(rust重拳出擊)

    算法leetcode|82. 刪除排序鏈表中的重復(fù)元素 II(rust重拳出擊)

    給定一個已排序的鏈表的頭 head , 刪除原始鏈表中所有重復(fù)數(shù)字的節(jié)點,只留下不同的數(shù)字 。返回 已排序的鏈表 。 鏈表中節(jié)點數(shù)目在范圍 [0, 300] 內(nèi) -100 = Node.val = 100 題目數(shù)據(jù)保證鏈表已經(jīng)按升序 排列 面對這道算法題目,二當家的再次陷入了沉思。 這道題目和 83. 刪除排序

    2024年02月08日
    瀏覽(26)
  • 力扣刷題-動態(tài)規(guī)劃算法3:完全背包問題

    力扣刷題-動態(tài)規(guī)劃算法3:完全背包問題

    問題描述: 1)有N件物品和一個最多能背重量為W的背包。第i件物品的重量是weight[i],得到的價值是value[i] 。 2) 每件物品都有無限個(也就是可以放入背包多次) (比0-1背包多出的條件) 3) 求解將哪些物品裝入背包里物品價值總和最大。 求解步驟: 1)首先遍歷物品,然

    2023年04月13日
    瀏覽(137)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包