算法刷題筆記 逆序對的數量(C++實現)

文章目錄

    • 題目描述
    • 解題代碼(蠻力版)
    • 解題代碼(基于歸并排序)

題目描述

  • 給定一個長度為n的整數數列,請你計算數列中的逆序對的數量。
  • 逆序對的定義如下:對于數列的第i個和第j個元素,如果滿足i<ja[i]>a[j],則其為一個逆序對;否則不是。
  • 輸入格式
    • 第一行包含整數n,表示數列的長度。
    • 第二行包含n個整數,表示整個數列。
  • 輸出格式
    • 輸出一個整數,表示逆序對的個數。
  • 數據范圍
    • 1≤n≤100000
    • 數列中的元素的取值范圍[1,10的9次方]

解題代碼(蠻力版)

起初解題的基本思路是:每次從序列中按照順序取出一個元素,然后逐一比較該元素與其后方的每一個元素是否構成逆序對。這種算法是一種平方時間復雜度的算法,實現代碼如下所示:

#include<cstdio>
using namespace std;const int N = 1e6 + 10;
int a[N];
int n;
int count(0);int main(void)
{scanf("%d",&n);for(int i(0);i<n;++i) scanf("%d",&a[i]);for(int i(0); i < n - 1; ++i)for(int j(i+1); j < n; ++j)if(a[i] > a[j]) count++;printf("%d",count);return 0;
}

上述代碼在輸入的數據量很大時運行超時,因此需要時間復雜度更低的算法。

解題代碼(基于歸并排序)

基于歸并排序的解題代碼如下:

#include<cstdio>
using namespace std;const int N(1e5 + 10);
int a[N];
int n;
int temp[N];typedef long long LL;LL merge_sort(int* a, const int& left, const int& right)
{if(left >= right) return 0;const int mid((left + right) >> 1);int i(left), j(mid + 1), k(0);LL count = (merge_sort(a, left, mid) + merge_sort(a, mid + 1, right));while(i <= mid && j <= right){if(a[i] <= a[j]) temp[k++] = a[i++];else{temp[k++] = a[j++];count += (mid - i + 1);}}while(i <= mid) temp[k++] = a[i++];while(j <= right) temp[k++] = a[j++];for(int i(0), j(left); j <= right;) a[j++] = temp[i++];return count;
}int main(void)
{scanf("%d",&n);for(int i(0); i < n; ++i) scanf("%d",&a[i]);printf("%lld",merge_sort(a, 0, n-1));return 0;
}

注意事項

  • long long數據類型的使用:上述代碼中使用了long long這種數據類型,這是考慮到如果使用int會超出范圍所致,分析如下:
    • 一個長度為n的序列最多含有n(n-1)/2個逆序對,當n很大時,大致為n2/2。當n的取值為題目中的上限100000時,則最多有50億個逆序對,超過了int的表示范圍(21億多),因此需要使用比int表示范圍更大的整數類型。
    • 比int類型表示范圍更大的整數類型有兩種,分別是longlong long。int占用四個字節,但是,long可能占有四個字節可能占用八個字節,因此其表示范圍不一定比int更大,所以需要使用一定占用八個字節的long long數據類型。
    • 代碼中,習慣使用typedef long long LLlong long類型進行重命名。
  • 計算前后段逆序對的時間:注意需要在歸并排序之前就計算原始序列的兩段子序列逆序對,而不是在代碼最后完成歸并排序了再進行計算,這樣會導致計算結果不同。

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

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

相關文章

Python高級進階--dict字典

dict字典?? 1. 字典簡介 dictionary&#xff08;字典&#xff09; 是 除列表以外 Python 之中 最靈活 的數據類型&#xff0c;類型為dict 字典同樣可以用來存儲多個數據字典使用鍵值對存儲數據 2. 字典的定義 字典用{}定義鍵值對之間使用,分隔鍵和值之間使用:分隔 d {中…

【ECharts】數據可視化

目錄 ECharts介紹ECharts 特點Vue2使用EChats步驟安裝 ECharts引入 ECharts創建圖表容器初始化圖表更新圖表 示例基本柱狀圖后臺代碼vue2代碼配置 組件代碼運行效果 基本折線圖示例代碼組件 基礎餅圖示例代碼后臺前端配置組件運行效果 其他 ECharts介紹 ECharts 是一個由百度開…

spring模塊(一)容器(4)ApplicationContextAware

一、介紹 1、問題引入 為了獲取已被實例化的Bean對象,如果使用再次加載配置文件的方法,可能會出現一個問題,如一些線程配置任務, 會啟動兩份,產生了冗余. ApplicationContext appContext new ClassPathXmlApplicationContext("applicationContext.xml"); UserS…

python 多線程處理圖片

thread for i in range(len(ori_path)):for filename in os.listdir(ori_path[i]):number_img number_img 1print("正在處理第" str(number_img) "張圖片")img_name ori_path[i] filenamet Thread(target deal_one_img, args [img_name, filenam…

使用.net core 調用C#WebService的三種方式

WebSerrvic代碼&#xff1a; [WebMethod]public string Test(string p1, string p2){return p1 "_" p2;} 以下是 SOAP 1.2 請求和響應示例。所顯示的占位符需替換為實際值。 POST /Service1.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charsetutf-8…

unity 制作app實現底部導航欄和頂部狀態欄

前段時間在用unity制作一個app&#xff0c;發現有個問題用unity制作的app&#xff0c;他默認是沒有頂部狀態欄的&#xff0c;也沒有底部的導航欄&#xff0c;是一個全部覆蓋的狀態。但仔細觀察可以發現&#xff0c;正常app&#xff0c;頂部狀態欄是有的&#xff0c;而且是透明的…

軟件設計師備考 | 案例專題之數據庫設計 概念與例題

相關概念 關注上圖中的兩個部分&#xff1a; 概念結構設計 設計E-R圖&#xff0c;也即實體-聯系圖。 工作步驟&#xff1a;選擇局部應用、逐一設計分E-R圖、E-R圖合并。進行合并時&#xff0c;它們之間存在的沖突主要有以下3類&#xff1a; 屬性沖突。同一屬性可能會存在于…

低功耗藍牙模塊輕松實現智能防丟器

低功耗藍牙模塊&#xff0c;作為集成藍牙無線技術功能的PCBA板&#xff0c;主要用于短距離無線通訊&#xff0c;已經成為物聯網無線傳輸發展的中堅力量。隨著藍牙技術不斷更新換代&#xff0c;越來越多的智能可穿戴設備出現在我們的生活中&#xff0c;智能手環&#xff0c;智能…

電商公司需不需要建數字檔案室呢

建立數字檔案室對于電商公司來說是非常有必要的。以下是一些原因&#xff1a; 1. 空間節約&#xff1a;數字檔案室可以將紙質文件轉化為電子文件&#xff0c;節省了大量存儲空間。這對于電商公司來說尤為重要&#xff0c;因為他們通常會有大量的訂單、客戶信息和供應商合同等文…

Java面向對象程序設計-Hash表

以下為翁愷老師在3.4Hash表中的示例代碼&#xff1a; package coins;import java.util.HashMap; import java.util.Scanner;public class Coin {private HashMap<Integer,String> coinnamesnew HashMap<Integer,String>();public Coin(){coinnames.put(1,"pe…

貸款業務——還款方式以及計算公式對比

文章目錄 等額本息等額本金先息后本&#xff08;按月付息&#xff0c;到期還本&#xff09;到期一次還本付息等本等息&#xff08;等額等息&#xff09;等本等息&#xff08;砍頭息&#xff09; 等額本息 等額本息&#xff1a;借款人每月還的金額固定&#xff08;本金利息總額…

力扣538. 把二叉搜索樹轉換為累加樹

Problem: 538. 把二叉搜索樹轉換為累加樹 文章目錄 題目描述思路復雜度Code 題目描述 思路 利用二叉搜索樹中序遍歷的特性&#xff0c;**降序遍歷&#xff08;此處是想表達先遍歷其右子樹再遍歷其左子樹這樣遍歷的過程中每個節點值得大小排序是降序得&#xff09;**其節點&…

寶塔PHP環境安裝配置Xdebug

寶塔PHP環境安裝配置Xdebug 安裝XdebugVSCode安裝插件編輯配置文件編輯配置運行調試斷點快捷鍵其他 安裝Xdebug 在寶塔中&#xff0c;找到PHP&#xff0c;打開管理頁面&#xff0c;選擇xdebug擴展&#xff0c;點擊操作欄中的安裝按鈕&#xff08;這里已經安裝過了&#xff0c;…

砍死怪獸的概率

題目描述&#xff1a;給定3個參數&#xff0c;N&#xff0c;M&#xff0c;K&#xff0c;怪獸有N滴血&#xff0c;等著英雄來砍自己&#xff0c;英雄每一次打擊&#xff0c;都會讓怪獸流失[0,M]的血量&#xff0c;流失的值每次在[0,M]上等概率的獲得一個值&#xff0c;求K次打擊…

kafka單機安裝及性能測試

kafka單機安裝及性能測試 Apache Kafka是一個分布式流處理平臺&#xff0c;最初由LinkedIn開發&#xff0c;并于2011年開源&#xff0c;隨后成為Apache項目。Kafka的核心概念包括發布-訂閱消息系統、持久化日志和流處理平臺。它主要用于構建實時數據管道和流處理應用&#xff0…

電商項目之有趣的支付簽名算法

文章目錄 1 問題背景2 思路3 代碼實現 1 問題背景 在發起支付的時候&#xff0c;一般都需要對發送的請求參數進行加密或者簽名&#xff0c;下文簡稱這個過程為“簽名”。行業內比較普遍的簽發算法有&#xff1a; &#xff08;1&#xff09;按支付渠道給定的字段排序進行拼接&am…

C++|設計模式(〇)|設計模式的六大原則

這里文章只做簡要描述&#xff0c;作為掃盲 在軟件開發過程中&#xff0c;遵循一定的設計原則可以幫助開發者創建更加靈活、可維護和可擴展的系統。設計模式的六大原則是面向對象設計的核心理念&#xff0c;本文將詳細介紹這些原則&#xff0c;并結合實例說明它們的重要性和應用…

Android Studio添加依賴 新版 和 舊版 的添加方式(Gradle添加依賴)(Java)

舊版的&#xff08;在線添加&#xff09; 1找 文件 在項目的build.gradle文件中添加依賴(在下面的節點中添加庫 格式 ’ 組 &#xff1a;名字 &#xff1a; 版本號 ‘ ) dependencies {implementation com.example:library:1.0.0 }implementation 組:名字:版本…

【lambdastreammaven】

lambda 匿名函數 為了簡化java中的匿名內部類 事件監聽 寫一個類 實現 ActionListener 接口 (外部類) | | 內部類 類在其他地方用不到, 索性就把這個類定義在類的內部使用 好處: 1.內部可以使用外部類的成員 …

互聯網十萬個為什么之什么是分布式計算?

分布式計算是一種計算方法&#xff0c;它將計算任務分散到多個物理或邏輯上分開的計算機&#xff08;稱為節點&#xff09;上執行&#xff0c;這些節點通過網絡互連并協作完成共同的目標。每個節點具備獨立的處理能力和存儲資源&#xff0c;在分布式系統中&#xff0c;它們共享…