leetcode(977)有序數組的平方

給你一個按 非遞減順序 排序的整數數組 nums,返回 每個數字的平方 組成的新數組,要求也按 非遞減順序 排序。

示例 1:
輸入:nums = [-4,-1,0,3,10]
輸出:[0,1,9,16,100]
解釋:平方后,數組變為 [16,1,0,9,100]
排序后,數組變為 [0,1,9,16,100]
示例 2:
輸入:nums = [-7,-3,2,3,11]
輸出:[4,9,9,49,121]

面對這樣的題目,先把原來的數據平方后,有幾種算來進行排序

1.直接插入排序:

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {//直接插入排序int i, j;//平方后的數組for (i = 0; i < nums.size(); i++){nums[i] = nums[i] * nums[i];}int temp = nums[0];for (i = 1; i < nums.size(); i++){if (nums[i] < nums[i - 1])//小的做為哨兵{temp = nums[i];//復制為哨兵for (j = i - 1; j >= 0 && nums[j] > temp ;  j--){nums[j + 1] = nums[j];}nums[j+1] = temp;}}return nums;}
};

在這里插入圖片描述
結果同樣的不盡如人意。

此算法的時間復雜度為O(n^2)

2.折半插入排序

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {//直接插入排序int i, j,low,high,mid;//平方后的數組for (i = 0; i < nums.size(); i++){nums[i] = nums[i] * nums[i];}int temp = nums[0];for (i = 1; i < nums.size(); i++){low=0;high=i-1;mid=(low+high)/2;if (nums[i] < nums[i - 1])//判斷是否比前一個小,如果小就插入{temp = nums[i];//復制為哨兵,進行判斷while(low<=high){if(temp>=nums[mid]){low=mid+1;}else{high=mid-1;}mid = (low + high) / 2;}for (j = i - 1; j>high ;  j--){nums[j + 1] = nums[j];}nums[high+1] = temp;}}return nums;}
};

折半插入排序插入排序也確實會比直接插入快了點。折半插入排序只是減少了比較次數,時間復雜度還是O(n^2)
在這里插入圖片描述

3.希爾排序時間復雜度約為O(n^1.3), 最壞情況下時O(n^2)

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int step,i,j,temp;//平方后的數組for (i = 0; i < nums.size(); i++){nums[i] = nums[i] * nums[i];}//希爾排序for(step=nums.size()/2;step>0;step/=2)//步長變化{for(i=step;i<nums.size();i++){temp=nums[i];for(j=i-step;j>=0 && temp<nums[j];j-=step){nums[j+step]=nums[j];//后移}nums[j+step]=temp;}}return nums;}
};

在這里插入圖片描述

結果有了顯著的提升

采用空間換時間雙指針的方法,優點類似與歸并排序

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int pos,i,j;vector<int> temp(nums.size());for(i=0,j=nums.size()-1,pos=nums.size()-1;i<=j;){if(nums[i]*nums[i]>nums[j]*nums[j]){temp[pos--]=nums[i]*nums[i];i++;}else{temp[pos--]=nums[j]*nums[j];j--;}}return temp;}
};

空間復制度為O(n)

在這里插入圖片描述
效果顯而易見

4.快速排序

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {for(int i=0;i<nums.size();i++){nums[i]=nums[i]*nums[i];}QuickSort(nums,0,nums.size()-1);return nums;}void QuickSort(vector<int>& nums,int low,int high){if(low<high){int pivotpos=Patition(nums,low,high);QuickSort(nums,low,pivotpos-1);QuickSort(nums,pivotpos+1,high);}}//快速排序int Patition(vector<int>& number,int low,int high){    int pivot=number[low];//樞紐while(low<high){   while(low<high && number[high]>=pivot) {high--;}number[low]=number[high];//置換while(low<high && number[low]<=pivot){low++;}number[high]=number[low];}number[low]=pivot;return low;}
};

在這里插入圖片描述

5.歸并排序

#include <iostream>
#include<vector>using namespace std;
//歸并排序void Merge(vector<int>& nums,int low,int mid,int high)
{int* temp = (int*)malloc(nums.size());int count, i, j;for (count = low; count <=high; count++){temp[count] = nums[count];}for (i = low, j = mid + 1, count = i; i <= mid&&j <= high; count++){if (temp[i] <= temp[j]){nums[count] = temp[i++];}else{nums[count] = temp[j++];}}while (i <= mid){nums[count++] = temp[i++];}while (j <= high){nums[count++] = temp[j++];}}void MergeSort(vector<int>& nums, int low, int high)
{if (low < high){int	mid = (low + high) / 2;MergeSort(nums, low, mid);MergeSort(nums, mid + 1, high);Merge(nums, low, mid, high);}}int main()
{//nums = [-4, -1, 0, 3, 10]vector<int> nums = { 16,1,0,100,10 };MergeSort(nums, 0, 4);for (int i = 0; i < 5; i++){printf(" % d\t", nums[i]);}}

leetcode中超時了,但是自己測試了一下沒啥問題

6.堆排序

void HeadAdjust(vector<int>& nums, int k, int len)
{int i, j;nums[0] = nums[k];for (i = 2 * k; i <= len; i*=2){if (i < len-1 && nums[i] < nums[i + 1]){i++;}if (nums[0] >= nums[i]){break;}else{nums[k] = nums[i];k = i;}}nums[k] = nums[0];
}
//大根堆
void BuildMaxHeap(vector<int>& nums,int len)
{int i = 0;for ( i= len / 2; i > 0; i--){HeadAdjust(nums, i, len);}
}void HeapSort(vector<int>& nums, int len)
{int i,temp=0;BuildMaxHeap(nums, len);//初始化大根堆for ( i= len-1; i > 1; i--){temp = nums[i];nums[i] = nums[1];nums[1] = temp;HeadAdjust(nums, 1, i - 1);}}int main()
{//nums = [-4, -1, 0, 3, 10]vector<int> nums = { 0,53,17,78,9,45,65,87,32 };HeapSort(nums,nums.size());//MergeSort(nums, 0, 7);for (int i = 1; i < 9; i++){printf(" %d\t", nums[i]);}}

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

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

相關文章

IO多路復用之select全面總結(必看篇)

轉載&#xff1a;http://www.jb51.net/article/101057.htm 1、基本概念 IO多路復用是指內核一旦發現進程指定的一個或者多個IO條件準備讀取&#xff0c;它就通知該進程。IO多路復用適用如下場合&#xff1a; &#xff08;1&#xff09;當客戶處理多個描述字時&#xff08;一般…

leetcode(189) 旋轉數組

**給定一個數組&#xff0c;將數組中的元素向右移動 k 個位置&#xff0c;其中 k 是非負數。 進階&#xff1a; 盡可能想出更多的解決方案&#xff0c;至少有三種不同的方法可以解決這個問題。 你可以使用空間復雜度為 O(1) 的 原地 算法解決這個問題嗎&#xff1f; 示例 1: …

I/O 多路復用之select

轉載&#xff1a;http://blog.csdn.net/u012432778/article/details/47347133 概述 Linux提供了三種 I/O 多路復用方案&#xff1a;select&#xff0c;poll和epoll。在這一篇博客里先討論select, poll 在將下一篇中介紹&#xff0c;epoll是Linux特有的高級解決方案&#xff0c;…

leetcode(283)移動零

283. 移動零 給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 示例: 輸入: [0,1,0,3,12] 輸出: [1,3,12,0,0] 說明: 必須在原數組上操作&#xff0c;不能拷貝額外的數組。 盡量減少操作次數。 方法一&#xff1…

exec函數族實例解析

轉載&#xff1a;http://www.cnblogs.com/blankqdb/archive/2012/08/23/2652386.html fork()函數通過系統調用創建一個與原來進程(父進程)幾乎完全相同的進程(子進程是父進程的副本&#xff0c;它將獲得父進程數據空間、堆、棧等資源的副本。注意&#xff0c;子進程持有的是上述…

leetcode(167)兩數之和 II - 輸入有序數組

兩數之和 II - 輸入有序數組 給定一個已按照 升序排列 的整數數組 numbers &#xff0c;請你從數組中找出兩個數滿足相加之和等于目標數 target 。 函數應該以長度為 2 的整數數組的形式返回這兩個數的下標值。numbers 的下標 從 1 開始計數 &#xff0c;所以答案數組應當滿足 …

常量指針與指針常量的區別(轉帖)

轉載&#xff1a;http://www.cnblogs.com/witty/archive/2012/04/06/2435311.html 三個名詞雖然非常繞嘴&#xff0c;不過說的非常準確。用中國話的語義分析就可以很方便地把三個概念區分開。 一) 常量指針。 常量是形容詞&#xff0c;指針是名詞&#xff0c;以指針為中心的一個…

c/c++錯題總結

1.類名 對象名 默認調用“對象名()”這個構造函數&#xff0c;在棧內存中存在對象名&#xff0c;在堆內存中存在實際對象&#xff1b; 2.類名 對象名(一個或以上個參數) 默認調用相應的構造函數&#xff0c;在棧內存中存在對象名&#xff0c;在堆內存中也是存在實際對象的&a…

智能指針學習筆記

轉載&#xff1a;http://www.cnblogs.com/wuchanming/p/4411878.html 1. 介紹 本文介紹智能指針的使用。智能指針是c 中管理資源的一種方式&#xff0c;用智能指針管理資源&#xff0c;不必擔心資源泄露&#xff0c;將c 程序員 從指針和內存管理中解脫出來&#xff0c;再者&…

c++程序編譯過程

c程序編譯分成四個過程&#xff1a;編譯預處理&#xff0c;編譯&#xff0c;匯編&#xff0c;鏈接 編譯預處理&#xff1a;處理以#為開頭 編譯&#xff1a;將.cpp文件翻譯成.s匯編文件 匯編&#xff1a;將.s匯編文件翻譯成機器指令.o文件 鏈接&#xff1a;匯編生產的目標文件.o…

仿函數(函數對象)

轉載&#xff1a;http://www.cnblogs.com/wuchanming/p/4411867.html 本文乃作者學習《C標準程序庫》的學習筆記&#xff0c;首先介紹了仿函數&#xff08;函數對象&#xff09;和函數適配器&#xff08;配接器&#xff09;的概念&#xff0c;然后列出STL中所有的仿函數&#x…

C++ template —— 動多態與靜多態(六)

轉載&#xff1a;http://www.cnblogs.com/yyxt/p/5157517.html 前面的幾篇博文介紹了模板的基礎知識&#xff0c;并且也深入的講解了模板的特性。接下來的博文中&#xff0c;將會針對模板與設計進行相關的介紹。 ------------------------------------------------------------…

變量之間的區別

全局變量、局部變量、靜態全局變量、靜態局部變量的區別 c變量根據定義具有不同的生命周期&#xff0c;會有不同的作用域&#xff0c;主要有六個作用域&#xff1a;全局作用域&#xff0c;局部作用域&#xff0c;文件作用域&#xff0c;類作用域&#xff0c;語句作用域&#xf…

計算機的網絡體系以及參考模型

計算機的網絡體系以及參考模型一、OSI七層模型二、TCP/IP參考模型三、TCP/IP 五層參考模型四、OSI 模型和 TCP/IP 模型異同比較五、OSI 和 TCP/IP 協議之間的對應關系六、為什么 TCP/IP 去除了表示層和會話層&#xff1f;七、數據如何在各層之間傳輸&#xff08;數據的封裝過程…

C++ 模板詳解(二)

轉載&#xff1a;http://www.cnblogs.com/gw811/archive/2012/10/25/2736224.html 四、類模板的默認模板類型形參 1、可以為類模板的類型形參提供默認值&#xff0c;但不能為函數模板的類型形參提供默認值。函數模板和類模板都可以為模板的非類型形參提供默認值。 2、類模板的類…

c++類對象的創建方式

對象創建限制在堆或棧 c類對象的創建方式對象創建限制在堆或棧C 中的類的對象的建立模式如何將類限制在堆上呢&#xff1f;C 中的類的對象的建立模式 C 中的類的對象的建立模式分為兩張&#xff1a;靜態建立&#xff0c;動態建立 靜態建立&#xff1a;由編譯器為對象在棧空間…

C++ 模板詳解(一)

轉載&#xff1a;http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C模板 模板是C支持參數化多態的工具&#xff0c;使用模板可以使用戶為類或者函數聲明一種一般模式&#xff0c;使得類中的某些數據成員或者成員函數的參數、返回值取得任意類型。 模板是一種對類…

劍指Offer09. 用兩個棧實現隊列

class CQueue { public:stack<int> stack1,stack2;CQueue() {//初始化棧while(!stack1.empty()){stack1.pop();}while(!stack2.empty()){stack2.pop();}}void appendTail(int value) {stack1.push(value);}int deleteHead() {if(stack2.empty()){while(!stack1.empty()){…

rk3588 之啟動

目錄 uboot版本配置修改編譯 linux版本配置修改編譯 啟動sd卡啟動制作spi 燒錄 參考 uboot 版本 v2024.01-rc2 https://github.com/u-boot/u-boot https://github.com/rockchip-linux/rkbin 配置修改 使用這兩個配置即可&#xff1a; orangepi-5-plus-rk3588_defconfig r…

C++引用詳解

轉載&#xff1a;http://www.cnblogs.com/gw811/archive/2012/10/20/2732687.html 引用的概念 引用&#xff1a;就是某一變量&#xff08;目標&#xff09;的一個別名&#xff0c;對引用的操作與對變量直接操作完全一樣。 引用的聲明方法&#xff1a;類型標識符 &引用名目標…