【刷題(17)】技巧

一 技巧基礎

二 136. 只出現一次的數字

1 題目

在這里插入圖片描述

2 解題思路

哈希表map

其實看到題目數組中某個元素出現的次數也可以直接用unordered_map容器統計每一個元素出現的次數,然后在遍歷整個map容器查看是否有元素出現的次數等于1

3 code

class Solution {
public:int singleNumber(vector<int>& nums) {//第一次遍歷,使用哈希來統計數組中元素出現次數unordered_map<int,int> map;for(int num:nums){map[num]++;}//第二次遍歷,查看是否有元素出現的次數等于1for(int num:nums){if(map[num]==1) return num;}return 0;}
};

三 169. 多數元素

1 題目

在這里插入圖片描述

2 解題思路

本題常見的三種解法:

  • 哈希表統計法: 遍歷數組 nums ,用 HashMap 統計各數字的數量,即可找出 眾數 。此方法時間和空間復雜度均為 O(N)O(N)O(N) 。
  • 數組排序法: 將數組 nums 排序,數組中點的元素 一定為眾數。
  • 摩爾投票法: 核心理念為 票數正負抵消 。此方法時間和空間復雜度分別為 O(N)O(N)O(N) 和 O(1)O(1)O(1) ,為本題的最佳解法。

哈希表+打擂臺(邊哈希,邊打擂臺,省去二次遍歷哈希表在麻煩)

我們使用哈希映射(HashMap)來存儲每個元素以及出現的次數。對于哈希映射中的每個鍵值對,鍵表示一個元素,值表示該元素出現的次數。

我們用一個循環遍歷數組 nums 并將數組中的每個元素加入哈希映射中。在這之后,我們遍歷哈希映射中的所有鍵值對,返回值最大的鍵。我們同樣也可以在遍歷數組 nums 時候使用打擂臺的方法,維護最大的值,這樣省去了最后對哈希映射的遍歷。

3 code

class Solution {
public:int majorityElement(vector<int>& nums) {unordered_map<int,int>map;//哈希int majority=0,cnt=0;//打擂臺//哈希for(int num:nums){map[num]++;//打擂臺if(map[num]>cnt){majority=num;cnt=map[num];}}return majority;}
};

四 75. 顏色分類

1 題目

在這里插入圖片描述

2 解題思路

首先,所有數都≤2,那么索性把所有數組置為2,然后遇到所有≤1的,就再全部置為1,,覆蓋了錯誤的2,這時候所有2的位置已經正確,最后所有≤0的全部置為0,也就覆蓋了一些錯誤的1,這時候,0和1的位置都正確。最重要的就是需要兩個指針指向下一個1或0的位置

3 code

class Solution {
public:void sortColors(vector<int>& nums) {int n0=0,n1=0;for(int i=0;i<nums.size();i++){int num=nums[i];//先將所有在數置為2nums[i]=2;//如果數值小于等于1,將數置為1//(為0的時候,會將1的計數位前推一位)if(num<=1){nums[n1]=1;n1++;}//如果數值小于等于0,將數置為0if(num<=0){nums[n0]=0;n0++;}}}
};

五 31. 下一個排列

1 題目

在這里插入圖片描述

2 解題思路

這道題是根據 維基百科 ,下圖所示:
在這里插入圖片描述
翻譯過來:

先找出最大的索引 k 滿足 nums[k] < nums[k+1],如果不存在,就翻轉整個數組;
再找出另一個最大索引 l 滿足 nums[l] > nums[k];
交換 nums[l] 和 nums[k];
最后翻轉 nums[k+1:]。
舉個例子:

比如 nums = [1,2,7,4,3,1],下一個排列是什么?

我們找到第一個最大索引是 nums[1] = 2

再找到第二個最大索引是 nums[4] = 3

交換,nums = [1,3,7,4,2,1];

翻轉,nums = [1,3,1,2,4,7]

完畢!

所以,

時間復雜度:O(n)O(n)O(n)

空間復雜度:O(1)O(1)O(1)

在這里插入圖片描述

3 code

class Solution {
public:void nextPermutation(vector<int>& nums) {int cur=nums.size()-2;//前面大于后面在while(cur>=0&&nums[cur]>=nums[cur+1]){cur--;}//已經是最大數組了if(cur<0){sort(nums.begin(),nums.end());}else{//表示找到國降序在一個位置int pos=nums.size()-1;while(nums[pos]<=nums[cur]){pos--;}swap(nums[cur],nums[pos]);reverse(nums.begin()+cur+1,nums.end());}}
};

六 31. 下一個排列

1 題目、

在這里插入圖片描述

2 解題思路

題目要求查找重復的整數,很容易想到使用「哈希表」,但是題目中要求「只用常量級 O(1 的額外空間」,該方法不符合題意
還可以考慮使用「力扣」第 41 題:缺失的第一個正數 的技巧,使用「原地哈希」,但是題目要求「你設計的解決方案必須不修改數組 nums」,該方法不符合題意
但是題目中還說:「數字都在 1 到 n 之間(包括 1 和 n)」,查找一個有范圍的整數,可以使用「二分查找」(這一點很重要,很多「二分查找」的問題就是要我們找一個整數);
「快慢指針」的做法很有技巧,具體做法請見其它題解。

可以使用「二分查找」的原因

因為題目要找的是一個 整數,并且這個整數有明確的范圍,所以可以使用「二分查找」。

重點理解:

這個問題使用「二分查找」是在數組 [1, 2,…, n] 中查找一個整數,而 并非在輸入數組數組中查找一個整數。

使用「二分查找」查找一個整數,這是「二分查找」的典型應用,經常被稱為「二分答案」。在 題解 中,「題型二」與「題型三」都是這樣的問題。

央視《幸運 52》節目的「猜價格游戲」,就是「二分答案」。玩家猜一個數字,如果猜中,游戲結束,如果主持人說「猜高了」,應該猜一個更低的價格,如果主持人說「猜低了」,應該猜一個更高的價格。

繼續 解題思路:每一次猜一個數,然后 遍歷整個輸入數組,進而縮小搜索區間,最后確定重復的是哪個數。

理解題意:

n + 1 個整數,放在長度為 n 的數組里,根據「抽屜原理」,至少會有 1 個整數是重復的;
抽屜原理:把 10 個蘋果放進 9 個抽屜,至少有一個抽屜里至少放 2 個蘋果。

方法:二分查找

「二分查找」的思路是先猜一個數(搜索范圍 [left…right] 里位于中間的數 mid),然后統計原始數組中 小于等于 mid 的元素的個數 count:

如果 count 嚴格大于 mid。根據 抽屜原理,重復元素就在區間 [left…mid] 里;
否則,重復元素可以在區間 [mid + 1…right] 里找到,其實只要第 1 點是對的,這里肯定是對的,但要說明這一點,需要一些推導,我們放在最后說。

方法:快慢指針

數組形式的鏈表

題目設定的問題是 N+1 個元素都在 [1,n] 這個范圍內。這樣我們可以用那個類似于 ‘缺失的第一個正數’ 這種解法來做,但是題意限制了我們不能修改原數組,我們只能另尋他法。也就是本編題解講的方法,將這個題目給的特殊的數組當作一個鏈表來看,數組的下標就是指向元素的指針,把數組的元素也看作指針。如 0 是指針,指向 nums[0],而 nums[0] 也是指針,指向 nums[nums[0]].
這樣我們就可以有這樣的操作

C++
int point = 0;
while(true){point = nums[point]; // 等同于 next = next->next; 
}

鏈表中的環

假設有這樣一個樣例:[1,2,3,4,5,6,7,8,9,5]。如果我們按照上面的循環下去就會得到這樣一個路徑:1 2 3 4 5 [6 7 8 9] [6 7 8 9] [6 7 8 9] . . .這樣就有了一個環,也就是 6 7 8 9。point 會一直在環中循環的前進。
這時我們設置兩個一快(fast)一慢(slow)兩個指針,一個每次走兩步,一個每次走一步,這樣讓他們一直走下去,直到他們在重復的序列中相遇,
在這里插入圖片描述

3 code

二分查找

class Solution {
public:int findDuplicate(vector<int>& nums) {int len=nums.size();int left=1;int right=len-1;while(left<right){int mid=(left+right)/2;//nums中小于等于mid的元素的個數int count=0;for(int num:nums){if(num<=mid){count++;}}if(count>mid){//下一輪搜索的區間[left..mid]right=mid;}else{//下一輪搜索的區間[mid+1..right]left=mid+1;}}//退出循環以后 left 與 right 重合,left (或者 right)就是我們要找的重復的整數;return left;}
};

快慢指針

class Solution {
public:int findDuplicate(vector<int>& nums) {int n = nums.size();int slow = 0;int fast = 0;//快慢指針相遇while (true) {slow = nums[slow];fast = nums[nums[fast]];if (slow == fast) break;}//快指針返回終點,繼續出發fast = 0;while (nums[slow] != nums[fast]) {slow = nums[slow];fast = nums[fast];}return nums[slow];}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22188.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22188.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22188.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

商城項目【尚品匯】07分布式鎖-2 Redisson篇

1 Redisson功能介紹 基于自定義setnx實現的分布式鎖存在下面的問題&#xff1a; 重入問題&#xff1a;重入問題是指 獲得鎖的線程可以再次進入到相同的鎖的代碼塊中&#xff0c;可重入鎖的意義在于防止死鎖&#xff0c;比如HashTable這樣的代碼中&#xff0c;他的方法都是使用…

LightGBM 進行回歸建模的流程

LightGBM 進行回歸建模的流程 文章最前&#xff1a; 我是Octopus&#xff0c;這個名字來源于我的中文名–章魚&#xff1b;我熱愛編程、熱愛算法、熱愛開源。所有源碼在我的個人github &#xff1b;這博客是記錄我學習的點點滴滴&#xff0c;如果您對 Python、Java、AI、算法有…

將HTML頁面中的table表格元素轉換為矩形,計算出每個單元格的寬高以及左上角坐標點,輸出為json數據

export function huoQuTableElement() {const tableData []; // 存儲表格數據的數組let res [];// 獲取到包含表格的foreignObject元素const foreignObject document.getElementById(mydctable);if (!foreignObject){return ;}// 獲取到表格元素let oldTable foreignObject…

Nativefier : 將網址打包成exe桌面程序

1、需求場景 在日常開發中&#xff0c;需要針對一些網頁在一體機上使用&#xff0c;同時在瀏覽器上也可以使用&#xff0c;這里推薦大家用nativefier&#xff0c;對網址進行打包。以下是nativefier安裝命令&#xff1a; npm install nativefier -g 2、使用方法 --arch 系統 …

《混凝土壩監測儀器系列型譜》修訂中監測儀器分類方案解讀

隨著科技的不斷進步和監測需求的日益增加&#xff0c;對監測儀器分類方案進行修訂已成為必然的趨勢。本文旨在探討《混凝土壩監測儀器系列型譜》中對現有儀器分類方式的修訂&#xff0c;以及監測儀器選用的相關內容。希望對大家中有所幫助&#xff1a; 一、取消過時條目&#x…

服務器是一種高性能計算機

服務器是一種高性能計算機&#xff0c;專門設計用于在網絡中提供各種服務。它們通常具備比普通計算機更快的CPU運算能力、更可靠的運行性能、更大的I/O外部數據吞吐能力以及更好的擴展性。

java中方法引用

目錄 方法引用&#xff1a; 引用靜態方法 引用成員方法 引用構造方法 使用類名引用成員方法 引用數組的構造方法 練習 方法引用&#xff1a; 把已經有的方法拿過來用&#xff0c;當做函數式接口中抽象方法的方法體 在Java中&#xff0c;方法引用是一種簡化Lambda表達式的…

詳解Spring支持的幾種注入方式

在 Spring 框架中&#xff0c;Bean 的注入方式主要有以下幾種&#xff0c;其中一些是自動注入的。以下是詳細說明&#xff1a; 1. 構造函數注入 (Constructor Injection) 自動注入&#xff1a;使用 Autowired 注解時&#xff0c;Spring 容器會自動調用帶有 Autowired 注解的構…

教務管理系統-學員辦理體系介紹

隨著時代的快速開展&#xff0c;教育方面也沒落下&#xff0c;不僅是線下線上都呈現許多訓練校園&#xff0c;辦理軟件也順勢而為的呈現廣闊訓練校園面前&#xff0c;許多的校園和訓練組織也都在運用教務管理系統了。運用教務管理系統里邊的學員辦理體系可以讓相應的辦理人員更…

Redis的一致性

一、產生的原因 使用緩存&#xff0c;在進行寫操作的時候就會出現不一致的問題。 一致性分為三類&#xff1a;強一致性&#xff0c;弱一致性&#xff0c;最終一致性 二、方案 2.1 延時雙刪 在更新數據庫的操作前后分別進行一次刪除緩存的操作&#xff0c;并在更新數據庫之后…

《HelloGitHub》第 98 期

興趣是最好的老師&#xff0c;HelloGitHub 讓你對編程感興趣&#xff01; 簡介 HelloGitHub 分享 GitHub 上有趣、入門級的開源項目。 github.com/521xueweihan/HelloGitHub 這里有實戰項目、入門教程、黑科技、開源書籍、大廠開源項目等&#xff0c;涵蓋多種編程語言 Python、…

Docker大學生看了都會系列(三、常用幫助、鏡像、容器命令)

系列文章目錄 第一章 Docker介紹 第二章 2.1 Mac通過Homebrew安裝Docker 第二章 2.2 CentOS安裝Docker 第三章 Docker常用命令 文章目錄 前言環境常用命令幫助命令鏡像命令容器命令 總結 前言 前面2章學完了基礎概念&#xff0c;實操安裝使用。接下來了解一些日常中常用的命令…

Java - 隨機存取文件類

在Java中&#xff0c;隨機存取文件&#xff08;Random Access File&#xff09;通常使用java.io.RandomAccessFile類來實現。這個類允許你讀取和寫入文件的任意位置&#xff0c;而不是像FileReader和FileWriter那樣只能從頭開始或追加到文件末尾。 RandomAccessFile類提供了用…

容器化部署fastdfs文件存儲

目錄 一、軟件信息 二、構建fastdfs鏡像 三、docker 啟動fdfs服務 四、k8s部署fdfs服務 1、fdfs部署文件 五、外部服務訪問 一、軟件信息 fastdfs版本&#xff1a;fastdfs:V5.11 libfastcommon版本: V1.0.36 fastdfs-nginx-module版本&#xff1a;V1.20 nginx版本&…

速盾:cdn技術詳解

CDN&#xff08;Content Delivery Network&#xff0c;內容分發網絡&#xff09;是一種基于分布式架構的網絡技術&#xff0c;通過將內容緩存到離用戶較近的服務器上&#xff0c;從而提升網站的訪問速度和可靠性。本文將詳細介紹CDN技術的原理和工作流程。 CDN技術的原理是將網…

h5相機功能

h5相機功能 利用vant input file <template><div class"mb10"><divv-for"(item, index) in info.imgList":key"index"class"imgItem f32 mr20"click"preview(item, index)"><img :src"doFileUrl…

<sa8650>QCX Usecase 使用詳解—如何在管道中添加多個 IPE 實例

<sa8650>QCX Usecase 使用詳解—如何在管道中添加多個 IPE 實例 一、前言二、UsecaseSRV添加新格式三、更新usecase.xml四、定義 IPE 的新實例五、添加新鏈接六、QCarcam測試XML一、前言 本節說明在使用Usecase/Pipeline XML 中添加多個 IPE 實例所需的更改。以下示例解釋了…

使用Spring Boot和MybatisPlus的Java CRM客戶關系管理系統源碼

項目名稱&#xff1a;CRM客戶關系管理系統 功能模塊及描述&#xff1a; 一、待辦事項 今日需聯系客戶&#xff1a;顯示當日需跟進的客戶列表&#xff0c;支持查詢和篩選。 分配給我的線索&#xff1a;管理分配給用戶的線索&#xff0c;包括線索列表和查詢功能。 分配給我的客…

導彈研究中常用坐標系及坐標系之間的變換

在導彈飛行控制過程中&#xff0c;需要時刻掌握導彈的飛行狀態 &#xff08;速度、位置、姿態角等&#xff09;&#xff0c;這就有賴于描述導彈飛行狀態的坐標系。除了大地坐標系和地心大地直角坐標系外&#xff0c;導彈常用的坐標系還有很多&#xff0c;合理而恰當地選擇參考系…

golang調用外部程序包os/exec中的 Command和CommandContext 函數創建的Cmd對象的區別

在go語言中&#xff0c;我們可以通過os/exec包中的Command和CommandContext 函數創建對應的外部程序執行Cmd對象&#xff0c; 這2個函數創建的cmd命令執行對象是有區別的&#xff0c;CommandContext創建的對象可以攜帶上下文&#xff0c;這個主要用于我們通過cancel函數給對應的…