優選算法2

五、位運算

常見位運算總結

&:有0就是0;

|:有1就是1

^:相同為0,相異就是1/無進位相加

給定一個數n,確定它的二進制表示中的第x位是0還是1:二進制中權值最小的是第0位,所以int整型是從第0位到第31位。于是n>>x &1就可以了

將一個數n的二進制表示的第x位修改成為1: (1<<x) | n

將一個數n的二進制表示的第x位修改成為0:(~(1<<x)) & n?

提取一個數n的二進制表示中最右側的1:n&(-n),正數變成負數的二進制表示就是按位取法再加1。-n的本質是將最右側的1的左邊區域(不包括最右側的1也就是當前位置)全部變成相反,其余的都不變。

干掉一個數n二進制表示中最右側的1,也就是將這個1變成0:n&(n-1) ,n-1的本質是將最右側的1右邊的區域(包含1)全部變成相反。

異或:a^a=0;a^0=a;a^b^c=a^(b^c);交換律;采用無進位相加很容易證明?

?1.判斷字符是否唯一


采用位圖的思想:因為單獨的一個整型變量就有32位比特位

優化點:鴿巢原理,也就是如果字符串的長度超過26,必定存在重復字符。

class Solution {
public:bool isUnique(string astr) {//利用鴿巢原理進行優化if(astr.size()>26) return false;int bitmap=0;for(auto ch:astr){//判斷字符出現在哈希表中if((1<<(ch-'a')) & bitmap) return false;//將當前字符加入到位圖中else bitmap+=(1<<(ch-'a'));//bitmap |= (1<<(ch-'a'))}return true;}
};

2.丟失的數字

class Solution {
public:int missingNumber(vector<int>& nums) {int n=nums.size()+1;int result=0;for(auto ch:nums) result^=ch;for(int i=0;i<n;i++) result^=i;return result;}
};

3.兩整數之和(巧妙)



利用異或的無進位相加,然后找到需要進位的地方。通過a&b可以找到需要進位的地方,因為只有1&1才能得到1,而這也是我們需要進位的地方。(a&b)<<1才是我們需要進位的位置。

class Solution {
public:int getSum(int a, int b) {while(b){int temp_a=a;a=temp_a^b;//先算出無進位相加的結果b=(temp_a&b)<<1;//算出進位}return a;}
};

4.只出現一次的數字


?

class Solution {
public:int singleNumber(vector<int>& nums) {int ret=0;for(int i=0;i<32;i++)//依次去修改ret中的每一位{int sum=0;//統計nums中第i比特位出現1的次數for(auto ch:nums)if(ch & (1<<i)) sum++;if(sum%3) ret |= (1<<i);//修改ret的第i比特位}return ret;}
};

5.消失的兩個數

??

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {vector<int> result;//將所有的數全部都異或到一起int tmp=0;int n=nums.size();for(auto ch:nums) tmp^=ch;for(int i=1;i<=n+2;i++) tmp^=i;//找到tmp中,比特位為1的那一位pos,在該比特位上a和b的比特值是不一樣的。int pos;for(pos=0;pos<32;pos++) if((tmp>>pos)&1) break;//根據pos位的不同,劃分成為兩類來異或int a=0,b=0;for(auto ch:nums){if((ch>>pos)&1) a^=ch;else b^=ch;}for(int i=1;i<=n+2;i++){if((i>>pos)&1) a^=i;else b^=i;}return {a,b};}
};

六、模擬算法

模擬算法就是依葫蘆畫瓢,思路比較簡單,但是算法流程存在很多細節,將流程轉換成為算法有比多要注意的細節。模擬題找優化一般都是通過找規律進行的。

6.替換所有的問號

class Solution {
public:string modifyString(string s) {int n=s.size();//遍歷字符串for(int i=0;i<n;i++){//找到?字符if(s[i]=='?'){//遍歷26個字母替換該字符for(char ch='a';ch<='z';ch++){//找到符合要求的字符,下面的if條件是關鍵if((i==0 || ch!=s[i-1]) && (i==n-1 || ch!=s[i+1])){s[i]=ch;break;}}}}return s;}
};

7.提莫攻擊


?

class Solution {
public:int findPoisonedDuration(vector<int>& timeSeries, int duration) {int result=0;for(int i=0;i<timeSeries.size()-1;i++){if(timeSeries[i+1]-timeSeries[i]>=duration) result+=duration;else result+=(timeSeries[i+1]-timeSeries[i]);}return result+duration;}
};

8.Z字形變換


class Solution {
public:string convert(string s, int numRows) {//處理邊界情況if(numRows==1) return s;string result;int n=s.size();int d=numRows*2-2;//公差d//1.先處理第一行for(int i=0;i<n;i+=d){result+=s[i];//}//2.處理中間行for(int k=1;k<numRows-1;k++)//枚舉每一行{for(int i=k,j=d-k;i<n || j<n;i+=d,j+=d)//注意不要將i<n || j<n寫成了i<n && j<n{if(i<n) result+=s[i];if(j<n) result+=s[j];}}//3.最后處理最后一行for(int i=numRows-1;i<n;i+=d){result+=s[i];}return result;}
};

9.外觀數列

class Solution {
public:string countAndSay(int n) {string result="1";if(n==1) return result;for(int i=1;i<n;i++)//翻譯n次{string tmp;int len=result.size();//采用雙指針來進行翻譯for(int left=0,right=0;right<len;){while(right<len && result[left]==result[right]) right++;//當right=len-1的邊界情況也可以正確處理tmp+=to_string(right-left);//to_string函數處理下標left和right的值不同的時候tmp+=result[left];left=right;}result=tmp;}return result;}
};

10.數青蛙


上述總結就是代碼的邏輯非常重要

class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {string t="croak";int n=t.size();vector<int> hash(n);//用數組來模擬哈希表unordered_map<char,int> index;//存儲t字符串每個字符char以及對應的下標intfor(int i=0;i<n;i++) index[t[i]]=i;//遍歷字符串for(auto ch:croakOfFrogs){//1、如果ch不在字符串t的范圍內if(index.count(ch)==0) return -1;//2、如果字符ch不是c并且前面并沒有匹配的字符if(ch!=t[0] && hash[index[ch]-1]<1) return -1;//3、正常運作if(ch==t[0] && hash[n-1]<1) hash[0]++;else if(ch==t[0] && hash[n-1]>=1) hash[0]++,hash[n-1]--;else hash[index[ch]]++,hash[index[ch]-1]--;}for(int i=0;i<n-1;i++) if(hash[i]!=0) return -1;return hash[n-1];}
};

七、分治

分治就是分而治之,將一個大問題轉換成為若干個相同或者相似的子問題,直到劃分到子問題可以快速解決為止。

10.顏色分類(快排關鍵)


?

class Solution {
public:void sortColors(vector<int>& nums) {int n=nums.size();int left=-1,right=n;for(int i=0;i<right;)//條件是i<right不是i<n,這是一個易錯點。{if(nums[i]==0) swap(nums[++left],nums[i++]);else if(nums[i]==1) i++;else swap(nums[--right],nums[i]);}}
};

?11.排序數組 (快排)

class Solution {
public:int getrandom(vector<int>& nums,int left,int right){int r=rand();return nums[r % (right-left+1) + left];}void sortArray_help(vector<int>& nums,int l,int r){//定義遞歸出口if(l>=r) return;//隨機方式選擇基準元素int standar=getrandom(nums,l,r);int left=l-1;int right=r+1;//分成三塊for(int i=l;i<right;){if(nums[i]<standar) swap(nums[++left],nums[i++]);else if(nums[i]==standar) i++;else swap(nums[--right],nums[i]);  }sortArray_help(nums,l,left);sortArray_help(nums,right,r);}vector<int> sortArray(vector<int>& nums) {srand(time(NULL));//種下一棵隨機數種子sortArray_help(nums,0,nums.size()-1);return nums;}
};

12.數組中的第k個最大元素

class Solution {
public:int getrandom(vector<int>&nums,int left,int right){int r=rand();return nums[r%(right-left+1)+left];}int qsort(vector<int>& nums,int l,int r,int k){if(l==r) return nums[l];//容易遺漏的點//1、隨機選擇基準元素int standard=getrandom(nums,l,r);//2、根據基準元素將數組分成三塊int left=l-1;int right=r+1;int i=l;while(i<right){if(nums[i]<standard) swap(nums[++left],nums[i++]);else if(nums[i]==standard) i++;else swap(nums[--right],nums[i]);}//分情況討論//下面的三個條件判斷是關鍵if(r-right+1>=k) return qsort(nums,right,r,k);else if(r-left>=k) return standard;else return qsort(nums,l,left,k-r+left);}int findKthLargest(vector<int>& nums, int k) {srand(time(NULL));return qsort(nums,0,nums.size()-1,k);}
};

13.最小k個數(未做)

14.歸并排序(歸并排序)

class Solution {
public:vector<int> tmp;//輔助數組用來排序void mergesort(vector<int>& nums,int left,int right){if(right<=left) return;//1、選擇中間點劃分區間int mid=(left+right)/2; //2、將左右區間排序int left1=left;int right1=mid;int left2=mid+1;int right2=right;mergesort(nums,left1,right1);mergesort(nums,left2,right2);int i=0;//3、合并兩個有序數組while(left1<=right1 && left2<=right2) tmp[i++]=nums[left1]<=nums[left2]?nums[left1++]:nums[left2++];//4、處理沒有遍歷完的數組while(left1<=right1) tmp[i++]=nums[left1++];while(left2<=right2) tmp[i++]=nums[left2++];//5、還原for(int i=left;i<=right;i++) nums[i]=tmp[i-left];     }vector<int> sortArray(vector<int>& nums) {tmp.resize(nums.size());mergesort(nums,0,nums.size()-1);return nums;}
};

15.交易逆序對的總數(未做)

class Solution {
public:int reversePairs_helper(vector<int>& nums,int left,int right){if(left>=right) return 0;int ret=0;//1、找中間點,將數組分成兩部分int mid=(left+right)>>1;//2.左邊的個數+排序+右邊的個數+排序ret +=reversePairs_helper(nums,left,mid);ret +=reversePairs_helper(nums,mid+1,right);//3.一左一右的個數int cur1=left,cur2=mid+1,i=0;vector<int> tmp(right-left+2);while(cur1<=mid && cur2<=right){if(nums[cur1]<=nums[cur2]) tmp[i++]=nums[cur1++];else{ret+= mid-cur1+1;tmp[i++]=nums[cur2++];}}while(cur1<=mid) tmp[i++]=nums[cur1++];while(cur2<=right) tmp[i++]=nums[cur2++];for(int j=left;j<=right;j++)nums[j]=tmp[j-left];return ret;}int reversePairs(vector<int>& record) {return reversePairs_helper(record,0,record.size()-1);}
};

16.計算右側小於當前元素的個數

class Solution {vector<int> ret;vector<int> index;//記錄nums當前元素的下標、int tmpNums[500010];int tmpIndex[500010];
public:vector<int> countSmaller(vector<int>& nums) {int n=nums.size();ret.resize(n);index.resize(n);for(int i=0;i<n;i++)index[i]=i;mergesort(nums,0,nums.size()-1);return ret;}void mergesort(vector<int>& nums,int left,int right)  {if(left>=right) return;int mid=(left+right)>>1;mergesort(nums,left,mid);mergesort(nums,mid+1,right);int cur1=left,cur2=mid+1,i=0;while(cur1<=mid && cur2<=right){if(nums[cur1]>nums[cur2]){tmpNums[i]=nums[cur1];ret[index[cur1]]+=right-cur2+1;tmpIndex[i]=index[cur1];i++;cur1++;}else{tmpNums[i]=nums[cur2];tmpIndex[i]=index[cur2];i++;cur2++;}}while(cur1<=mid){tmpNums[i]=nums[cur1];tmpIndex[i]=index[cur1];i++;cur1++;}while(cur2<=right){tmpNums[i]=nums[cur2];tmpIndex[i]=index[cur2];i++;cur2++;}for(int j=left;j<=right;j++){nums[j]=tmpNums[j-left];index[j]=tmpIndex[j-left];}}
};

17.翻轉對

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

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

相關文章

堅持100天學習打卡Day1

1.大小端 2.引用的本質 及 深拷貝與淺拷貝 3.初始化列表方式 4.類對象作為類成員 5.靜態成員 static

vue3使用v-html實現文本關鍵詞變色

首先看應用場景 這有一段文本內容&#xff0c;是項目的簡介&#xff0c;想要實現將文本中的關鍵詞進行變色處理 有如下關鍵詞 實現思路 遍歷文本內容&#xff0c;找到關鍵詞&#xff0c;并使用某種方法更改其字體樣式。經過搜尋資料決定采用v-html實現&#xff0c;但是v-h…

解決pycharm安裝dlib失敗的問題

今天使用pycharm來學習opencv人臉識別庫face-recognition的時候出現了一點小問題&#xff0c;在pycharm中直接安裝face-recognition會失敗&#xff0c;說是因為缺少依賴庫dlib&#xff0c;但是直接使用pycharm安裝dlib庫也有問題&#xff0c;不知道大家遇到沒有 錯誤提示 note…

【深度學習】菜品目標檢測軟件系統

深度學習類文章回顧 【YOLO深度學習系列】圖像分類、物體檢測、實例分割、物體追蹤、姿態估計、定向邊框檢測演示系統【含源碼】 【深度學習】物體檢測/實例分割/物體追蹤/姿態估計/定向邊框/圖像分類檢測演示系統【含源碼】 【深度學習】YOLOV8數據標注及模型訓練方法整體流程…

AI智能寫作工具,AI寫作助手大全

隨著人工智能技術的快速發展&#xff0c;AI智能寫作工具助手已成為學術研究、內容創作和商業文案等領域的重要輔助工具。它們不僅能夠提高寫作效率&#xff0c;還能激發創意靈感&#xff0c;為各行各業的專業人士提供了強大的支持。下面小編將為大家全面介紹目前市場上備受矚目…

[C#][opencvsharp]C#使用opencvsharp進行年齡和性別預測支持視頻圖片檢測

使用 OpenCVSharp 來調用 age_net.caffemodel 和 gender_net.caffemodel 來進行性別和年齡預測涉及幾個步驟。以下是一個簡化的流程和示例文案&#xff1a; 1. 準備工作 確保你已經安裝了 OpenCVSharp 和相關的依賴項。確保你有 age_net.prototxt、age_net.caffemodel、gende…

大數據面試必問的數據治理面試題大全及參考答案

什么是數據治理?它與數據管理的區別是什么? 數據治理是組織內數據的系統性管理策略,它確保數據在整個生命周期中的可用性、準確性、安全性和合規性。數據治理不僅關乎技術實施,更是關于組織結構、政策、流程和標準的建立,以指導數據的收集、存儲、處理、保護和利用。它關…

代碼隨想錄算法跟練 | Day10 | 棧與隊列 Part01

個人博客主頁&#xff1a;http://myblog.nxx.nx.cn 代碼GitHub地址&#xff1a;https://github.com/nx-xn2002/Data_Structure.git Day10 232. 用棧實現隊列 題目鏈接&#xff1a; https://leetcode.cn/problems/implement-queue-using-stacks/ 題目描述&#xff1a; 請你僅…

在 Debian 服務器上安裝和配置 Apache Tomcat 的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 介紹 Apache Tomcat 是一個應用服務器&#xff0c;可用于向 web 用戶提供 Java 應用程序。它是由 Sun Microsystems 開發的 Java Servle…

詳解SpringSecurity中的Filter Chain

在Spring Security中&#xff0c;Filter Chain&#xff08;過濾器鏈&#xff09;是實現請求安全控制的核心。Spring Security的安全框架是建立在Servlet過濾器的基礎上的&#xff0c;通過一系列過濾器來實現不同的安全特性&#xff0c;如認證、授權等。 什么是Filter Chain F…

正版軟件 | 『閃點清單』— 您的智能懸浮任務管理專家

在繁忙的日常中&#xff0c;我們經常需要一個既能隨時提醒&#xff0c;又不會打擾我們的待辦事項管理工具。『閃點清單』&#xff0c;一款簡約而不簡單的懸浮清單軟件&#xff0c;為您帶來全新的任務管理體驗。 設計簡約&#xff0c;功能強大 『閃點清單』以其簡約的設計和強大…

CVPR講座總結(二)-探索圖像生成基礎模型的最新進展探索多模態代理的最新進展:從視頻理解到可操作代理

引言 在CVPR24上的教程中&#xff0c;微軟高級研究員Linjie Li為我們帶來了多模態代理的深入探索。這些代理通過整合多模態專家和大語言模型&#xff08;LLM&#xff09;來增強感知、理解和生成能力。本文總結了Linjie Li的講座內容&#xff0c;重點介紹了多模態記憶、可操作代…

供應鏈攻擊是什么?

隨著企業對技術和連接性的依賴日益增加&#xff0c;以及對第三方的普遍依賴&#xff0c;供應鏈攻擊變得越來越普遍。這些攻擊旨在通過供應商和商業伙伴損害企業。 供應鏈攻擊可能對企業和組織構成重大威脅&#xff0c;因為它們可能危及它們的安全以及向客戶提供的產品和服務的…

GPT-5或于一年半后發布?淺談智能的飛躍與未來

一、前言 IT之家6月22日消息&#xff0c;在美國達特茅斯工程學院周四公布的采訪中&#xff0c;OpenAI首席技術官米拉穆拉蒂被問及GPT-5是否會在明年發布&#xff0c;給出了肯定答案并表示將在一年半后發布。 技術的風暴從未停止&#xff0c;人工智能作為這場風暴中的旋風&…

ant-design-vue:Button的樣式不是藍色

ant-design-vue中a-button&#xff0c;設置的樣式是“primary”。但不是藍色。 解決方法&#xff1a;重新自定義樣式 參考鏈接&#xff1a; https://www.jianshu.com/p/0b2fde46c761 HTML&#xff1a; <a-buttonclass"c-button-primary"type"primary&quo…

《昇思25天學習打卡營第2天 | 張量 Tensor》

《昇思25天學習打卡營第2天 | 張量 Tensor》 《昇思25天學習打卡營第2天 | 張量 Tensor》 《昇思25天學習打卡營第2天 | 張量 Tensor》什么是張量&#xff08;Tensor&#xff09;張量的創建方式根據數據直接生成從NumPy數組生成使用init初始化器構造張量繼承另一個張量的屬性&a…

unity 導入的模型設置講解

咱們先講Model這一欄 Model Scene&#xff1a;場景級屬性&#xff0c;例如是否導入燈光和照相機&#xff0c;以及使用什么比例因子。 Scale Factor&#xff1a;縮放因子&#xff08;也就是模型導入后大小如果小了或者大了在這里直接改是相當于該模型的大小的&#xff0c;而且在…

瀏覽器擴展V3開發系列之 chrome.runtime 的用法和案例

【作者主頁】&#xff1a;小魚神1024 【擅長領域】&#xff1a;JS逆向、小程序逆向、AST還原、驗證碼突防、Python開發、瀏覽器插件開發、React前端開發、NestJS后端開發等等 chrome.runtime API 提供了一系列的方法和事件&#xff0c;可以通過它來管理和維護 Chrome 擴展的生命…

讓GNSSRTK不再難【第14講-第二部分】

14.1.2 多個系統多個頻率 在 10.3 節中,我們介紹了衛星碼偏差產生原因,信號發出的是天線相位中心,而不是信號發生器。同樣的,對于接收機也存在相同的問題,即從模擬機的天線相位中心到內部信號跟蹤環路這段的時延我們是無法知曉的。 如果多個系統僅僅使用一個地點進行定位…

什么!你還不會Redis?跟著我講透Redis【上篇之初識與安裝】

1 NoSQL是什么 1.1 NoSQL數據庫概述 NoSQL(NoSQL Not Only SQL )&#xff0c;意即”不僅僅是SQL“&#xff0c;泛指非關系型的數據庫。 NoSQL 不依賴業務邏輯方式存儲&#xff0c;而以簡單的key-value模式存儲。因此大大的增加了數據庫的擴展能力。 不遵循SQL標準。不支持A…