【2018年數據結構真題】

方法一

給定一個含n(n>=1)個整數的數組,請設計一個在時間上盡可能高效的算法,找出數組中未出現的最小正整數。例如,數組{-5,3,2,3}中未出現的最小正整數是1;數組{1,2,3}中未出現的最小正整數是4。要求:

  1. 給出算法的基本設計思想。

  2. 根據設計思想,采用C或C++語言描述算法,關鍵之 處給出注釋。

  3. 說明你所設計算法的時間復雜度和空間復雜度。

讀完題目先找關鍵詞,這里可以直接提取這樣幾個關鍵詞

  • 使用數組,求未出現的最小正整數
  • 看到數組,是不是想到是否有序
  • 時間+空間盡可能高效

暴力解:快速排序,然后掃描一遍數組

先對數組A快速排序得到升序序列,然后遍歷數組找到第一個未出現的最小正整數。

void Qsort(int A[], L, R){      //a數組保存數據,L和R是邊界if (L>=R) return;      //當前區間元素個數<=1則退出int key, i=L, j=R;     //i和j是左右兩個數組下標移動//把a數組中隨機一個元素和A[L]交換,快排優化,使得基準值的選取隨機key=A[L]; //key作為樞值參與比較while (i<j){while (i<j && A[j]>key) j--;while (i<j && A[i]<=key) i++;if (i<j) swap(A[i], A[j]); //交換A[i]和A[j]}swap(A[L], A[i]);Qsort(A, L, i-1); //遞歸處理左區間Qsort(A, i+1, R); //遞歸處理右區間}void ans(int A[], n){ //算法代碼Qsort(A, 0, n-1);int i=0;while (i<n && A[i]<=0) i++;if (i==n){ //數組A全是非正數cout<<1;//輸出1 return;}/*到這里,A[i]是數組中最小的正數*/ int t=1;//t從1開始for (int j=i; j<n; j++){ if (t==A[j])continue; if (t+1==A[j])t++;else{ //t+1空缺cout<<t+1; //輸出j-i+1 return;}cout<<t+1;//遍歷完數組,輸出t+1}
}

方法二

解析:

思想借鑒到了 Counting sort 中的方法。既然不能用額外空間,那就只有利用
數組本身,跟 Counting sort 一樣,利用數組的 index 來作為數字本身的索引,把正
數按照遞增順序依次放到數組中。即讓 A[0]=1, A[1]=2, A[2]=3, … , 這樣一來,
最后如果哪個數組元素違反了 A[i]=i+1 即說明 i+1 就是我們要求的第一個缺失的正
數。對于那些不在范圍內的數字,我們可以直接跳過,比如說負數,0,或者超過數組
長度的正數,這些都不會是我們的答案。

思路:

交換數組元素,使得數組中第 i 位存放數值(i+1)。最后遍歷數組,尋找第一
個不符合此要求的元素,返回其下標。整個過程需要遍歷兩次數組,復雜度為 O(n)。
下圖以題目中給出的第二個例子為例,講解操作過程。

image.png

public int firstMissingPositive(int []A){if(A==null||A.length==0){return 1;}for(int i=0;i<A.length;i++){if(A[i]<=A.length && A[i]>0 && A[A[i]-1]!=A[i]){int temp = A[A[i]-1];A[A[i]-1] = A[i];A[i] = temp;i--;}}for(int i=0;i<A.length;i++){it(A[i]!=i+1)return i+1;}return A.length+1;
}

實現中還需要注意一個細節,就是如果當前的數字所對應的下標已經是對應數字了,
那么我們也需要跳過,因為那個位置的數字已經滿足要求了,否則會出現一直來回交
換的死循環。這樣一來我們只需要掃描數組兩遍,時間復雜度是 O(2*n)=O(n),而且
利用數組本身空間,只需要一個額外變量,所以空間復雜度是 O(1)。

補充

Counting sort 基本思想

對于給定的輸入序列中的每一個元素 x,確定該序列中值小于 x 的元素的個數 。一
旦有了這個信息,就可以將 x 直接存放到最終的輸出序列的正確位置上。它創建一個
長度為這個數據范圍的數組 C,C 中每個元素記錄要排序數組中對應記錄的出現個
數。

下面以示例來說明這個算法:

假設要排序的數組為 A = {1,0,3,1,0,1,1}這里最大值為 3,最小值為 0,那么我們
創建一個數組 C,長度為 4。

然后一趟掃描數組 A,得到 A 中各個元素的總數,并保持到數組 C 的對應單元中。比如 0 的出現次數為 2 次,則 C[0] = 2;1 的出現次數為4 次,則 C[1] = 4。由于 C 是以 A 的元素為下標的,所以這樣一做,A 中的元素在 C中自然就成為有序的了,這里我們可以知道 順序為 0,1,3 (2 的計數為 0)然后我們把這個在 C 中的記錄按每個元素的計數展開到輸出數組 B 中,排序就完成了。

也就是 B[0] 到 B[1] 為 0 B[2] 到 B[5] 為 1 這樣依此類推。
這種排序算法,依靠一個輔助數組來實現,不基于比較,算法復雜度為 O(n) ,但由
于要一個輔助數組 C,所以空間復雜度要大一些,由于計算機的內存有限,所以這種
算法不適合范圍很大的數的排序。

上述為計數排序算法的經典解法,不過這個解法并不是最優的,因為空間復雜度還應
該可以優化,我們完全可以不要那個輸出的數組 B,直接對 C 進行排序。

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

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

相關文章

AIGC變革BI行業,永洪發布vividime全球化品牌

大數據產業創新服務媒體 ——聚焦數據 改變商業 國內BI商業智能市場&#xff0c;一直有著“內永洪&#xff0c;外Tableau”的說法。成立于2012年的永洪科技經過十多年的發展&#xff0c;早已崛起為國內大數據行業的一支勁旅。 ChatGPT火爆出圈之后&#xff0c;AIGC快速滲透&am…

每日一練 | 華為認證真題練習Day19

Day19 華為認證中級考試真題 1、DHCP協議運行過程中&#xff0c;客戶端從申請到IP地址時的流程是 A.1-2-3-4 B.1-4-3-2 C.3-2-1-4 D.3-4-1-2 2、VRRP報文的IP協議號是&#xff1a; A.112 B.114 C.116 D.118 3、MPLS的標簽字段共有多少bit? A.8 B.3 C.1 D.20 4…

【C++】vector的介紹與使用

&#x1f9d1;?&#x1f393;個人主頁&#xff1a;簡 料 &#x1f3c6;所屬專欄&#xff1a;C &#x1f3c6;個人社區&#xff1a;越努力越幸運社區 &#x1f3c6;簡 介&#xff1a;簡料簡料&#xff0c;簡單有料~在校大學生一枚&#xff0c;專注C/C/GO的干貨分…

2020年下半年試題一:論信息系統項目的成本管理

論文題目 1.概要敘述你參與過的信息系統項目&#xff08;項目的背景、項目規模、發起單位、目的、項目內容、組織結構、項目周期、交付的成果等&#xff09;&#xff0c;并說明你在其中承擔的工作&#xff08;項目背景要求本人真實經歷&#xff0c;不得抄襲及杜撰&#xff09;。…

編程語言發展史:匯編語言的出現和發展

一、匯編語言的出現 隨著計算機硬件的發展&#xff0c;機器語言變得越來越復雜&#xff0c;難以被人類程序員理解和編寫。因此&#xff0c;出現了更高級別的編程語言&#xff0c;這些語言使用類似英語的語法&#xff0c;使程序員能夠更容易地編寫和維護程序。 其中一種高級語…

web網頁滲透測試

web網頁滲透測試 流程 信息收集網站掃描訪問控制測試漏洞掃描嘗試注入攻擊驗證漏洞后滲透測試滲透測試報告 信息收集 收集目標網站的基本信息&#xff0c;包括域名、IP 地址、子域名等。使用 WHOIS 查詢、搜索引擎、子域名枚舉工具等進行信息收集。 網站掃描 使用端口掃描…

【Java 進階篇】Redis 數據結構:輕松駕馭多樣性

引言 Redis是一款強大的鍵值對存儲系統&#xff0c;其數據結構的多樣性是其引以為傲的特點之一。在這篇博客中&#xff0c;我們將深入探討Redis的主要數據結構&#xff0c;包括字符串、哈希表、列表、集合和有序集合&#xff0c;并通過實例代碼演示它們的用法。 1. 字符串&am…

在中國企業出海的大浪潮下,亞馬遜云科技提供遍及全球的基礎設施和技術支持

中國技術出海是中國企業更高層次更高質量的全球化。在人類文明發展史上&#xff0c;凝聚中國古人智慧結晶的造紙術、印刷術、火藥、指南針等&#xff0c;曾為中國技術出海寫下過濃墨重彩的一筆。在今天&#xff0c;如金山辦公、店匠科技、ADVANCE.AI等公司又以技術立業&#xf…

msvcp140.dll是什么?msvcp140.dll丟失的有哪些解決方法

在計算機使用過程中&#xff0c;我們經常會遇到一些錯誤提示&#xff0c;其中之一就是“msvcp140.dll丟失”。這個錯誤通常會導致某些應用程序無法正常運行。為了解決這個問題&#xff0c;我們需要采取一些措施來修復丟失的msvcp140.dll文件。本文將詳細介紹5個解決msvcp140.dl…

Day27|Leetcode 39. 組合總和 Leetcode 40. 組合總和 II Leetcode131. 分割回文串

Leetcode 39. 組合總和 題目鏈接 39 組合總和 本題目和前面的組合問題差不多&#xff0c;只不過這里能重復選取數字&#xff0c;還是要注意組合的定義&#xff0c;交換數字順序還是算一個組合&#xff0c;所以這里還是用我們的startIndex來記錄取的數字到哪里了&#xff0c;下…

阿里云發送短信

官方代碼如下&#xff1a; // This file is auto-generated, dont edit it. Thanks. package com.aliyun.sample;import com.aliyun.tea.*;public class Sample {/*** 使用AK&SK初始化賬號Client* param accessKeyId* param accessKeySecret* return Client* throws Excep…

【電子通識】USB3.0和USB2.0有什么區別?

版本 USB2.0是2000年4月27日由USB-IF組織提出了USB2.0總線協議規范。 USB3.0是2008年11月17日由USB-IF組織提出了超高速USB3.0規范。 圖標對比 USB2.0的標志就是和USB1.1的標志基本上沒啥區別&#xff0c;還是以前的那個樣子&#xff0c;使用黑色顏色用標識 USB3.0它有一個S…

計算機畢業設計 基于微信小程序的“共享書角”圖書借還管理系統的設計與實現 Java實戰項目 附源碼+文檔+視頻講解

博主介紹&#xff1a;?從事軟件開發10年之余&#xff0c;專注于Java技術領域、Python人工智能及數據挖掘、小程序項目開發和Android項目開發等。CSDN、掘金、華為云、InfoQ、阿里云等平臺優質作者? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精…

pycurl>=7.43.0.5機器學習環境配置問題

去官網下載對應版本.whl文件&#xff0c;注意使用python --version提前查看 python版本信息和64bit還是32bit,下載對應版本。 cd 到該路徑下&#xff0c;并pip。6

opengl制作天空盒

首先創建頂點數組 unsigned int m_uiVaoBufferID; glGenVertexArrays(1, &m_uiVaoBufferID); 然后創建頂點緩沖區 float skyboxVertices[] {// positions-1.0f, 1.0f, -1.0f,-1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, 1.0f, -1.0f,-1.0f, 1.…

當npm下載庫失敗時可以用cnpm替代

下載cnpm npm install -g cnpm --registryhttp://registry.npmmirror.com 然后使用cnpm代替npm下載即可 cnpm install

使用gin 代理 web網頁

問web項目的代理&#xff0c;業界常用的方案是nginx做代理&#xff0c;這個是網上最多資料的。 因為我需要做自己的流量轉發&#xff0c;也就是所有訪問都要經過我的一個流量分發微服務&#xff0c;這和nginx作用沖突了。如果再加個nginx來做第一層方向代理和網頁的靜態資源代…

【C++干貨鋪】list的使用 | 模擬實現

個人主頁點擊直達&#xff1a;小白不是程序媛 C專欄&#xff1a;C干貨鋪 代碼倉庫&#xff1a;Gitee 目錄 list的介紹及使用 list的介紹 list的使用 list的構造 list迭代器的使用 list的增刪查改 list的模擬實現 結點的封裝 迭代器的封裝 list成員變量 構造函數 …

【大數據Hive】hive 優化策略之job任務優化

目錄 一、前言 二、hive執行計劃 2.1 hive explain簡介 2.1.1 語法格式 2.1.2 查詢計劃階段說明 2.2 操作演示 2.2.1 不加條件的查詢計劃分析 2.2.2 帶條件的查詢計劃分析 三、MapReduce屬性優化 3.1 本地模式 3.1.1 本地模式參數設置 3.1.2 本地模式操作演示 3.2 …

每日一題:LeetCode-589.N叉樹的前序遍歷

每日一題系列&#xff08;day 01&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…