編程算法 - 將排序數組按絕對值大小排序 代碼(java)

一個含有多個元素的數組,有多種排序方式。它可以升序排列,可以降序排列,也可以像我們以前章節說過的,以波浪形方式排序,現在我們要看到的一種是絕對值排序。對于數組A,絕對值排序滿足以下條件:|A[i]| < |A[j]|,只要i < j。例如下面的數組就是絕對值排序:

A:-49, 75, 103, -147, 164,-197,-238,314,348,-422
  • 1

給定一個整數k,請你從數組中找出兩個元素下標i,j,使得A[i]+A[j] == k。如果不存在這樣的元素配對,你返回(-1,-1)。

對于這個題目,我們曾經討論過當數組元素全是整數時的情況,要找到滿足條件的配對(i,j),我們讓i從0開始,然后計算m = k - A[i],接著在(i+1, n)這部分元素中,使用折半查找,看看有沒有元素正好等于m,如果在(i+1,n)中存在下標j,滿足A[j] == m 那么我們就可以直接返回配對(i,j),這種做法在數組元素全是正數,全是負數,以及是絕對值排序時都成立,只是在絕對值排序的數組中,進行二分查找時,需要比對的是元素的絕對值。使用這種查找辦法,算法的時間復雜度是O(n*lg(n))。

上面算法形式很緊湊,無論數組全是正數,負數,還是絕對值排序時,都有效。但我們還可以找到效率更高的算法,假設數組中的元素全是同一符號,也就是全是正數,或全是負數時,要找到A[i]+A[j] == k,我們可以這么做:?
1,讓i = 0, j = n-1, 如果A[i] + A[j] == k 那么算法結束。?
2,如果A[i] + A[j] < k, 那么令 i = i +1;?
3,如果A[i] + A[j] > k, 那么令 j = j -1;?
上面步驟一直運行到i == j,或是A[i]+A[j] == k為止。這種做法的時間復雜度是O(n)。其算法效率比前面提到的方法要好,但問題在于,這種做法不能運用于絕對值排序的數組。為了能夠應對絕對值排序的數組,我們需要對算法做一些改進。

對于滿足A[i]+A[j] == k的元素,它必定滿足下面三種情況之一:?
1,A[i]和A[j]都是正數。?
2,A[i]和A[j]都是負數。?
3,A[i]和A[j]是一正一負。?
對于前兩種情況我們可以直接使用剛才使用的方法,對于第三種情況,我們需要做一個調整,對于第三種情況,我們讓i指向最后一個整數,讓j指向最后一個負數,如果A[i]+A[j] == k,那么算法結束,如果A[i]+A[j] > k, 那么讓i指向下一個正數,如果A[i]+A[j] < k,那么讓j指向下一個負數。

因此在查找滿足條件的元素配對時,我們先看看前兩種情況是否能查找到滿足條件的元素,如果不行,那么我們再依據第三種情況去查找,無論是否存在滿足條件的元素配對,我們算法的時間復雜度都是O(n)。我們看看相應的代碼實現:


public class FindPairInAbsoluteSortedArray {private int[] sortedArray;private int indexI;private int indexJ;private boolean bSuccessed = false;private int k ;public FindPairInAbsoluteSortedArray(int[] sortedArray, int k) {this.sortedArray = sortedArray;this.indexI = -1;this.indexJ = -1;this.k = k;}private void findPairWithSameSign(boolean positive) {/** 如果滿足條件的元素對都是正數或負數的話,那么用i指向第一個正數或負數,j指向最后一個整數或負數,* 如果兩元素都是正數,如果A[i]+A[j] == k,算法結束,如果A[i] + A[j] > k, 那么j--;* 如果A[i]+A[j] < k,那么i++ * * 如果兩元素都是負數,A[i] + A[j] == k 算法結束,如果A[i]+A[j]>k, 那么i++,直到下一個負數* 如果A[i]+A[j] < k ,那么j-- 直到下一個負數*/int i = 0, j = this.sortedArray.length - 1;if (positive == true) {while (this.sortedArray[i] < 0) {i++;}while (this.sortedArray[j] < 0) {j--;}} else {while (this.sortedArray[i] > 0) {i++;}while (this.sortedArray[j] > 0) {j--;}}do {if (this.sortedArray[i] + this.sortedArray[j] == this.k) {this.bSuccessed = true;this.indexI = i;this.indexJ = j;break;}if (this.sortedArray[i] + this.sortedArray[j] < this.k) {if (positive == true) {i++;while (i < this.sortedArray.length && this.sortedArray[i] < 0) {i++;}} else {j--;while (j > 0 && this.sortedArray[j] > 0) {j--;}}}else {if (positive == true) {j--;while (i < this.sortedArray.length && this.sortedArray[j] < 0) {j--;}} else {i++;while (i < this.sortedArray.length && this.sortedArray[i] > 0) {i++;}}}}while (i < j);}private void findPairWithDifferentSign() {/** 把i指向最后一個正數,把j指向最后一個負數,如果A[i] + A[j] == k, 算法結束* 如果A[i] + A[j] < k,那么j--;* 如果A[i] + A[j] > k , 那么k--*/int i = this.sortedArray.length-1;int j = this.sortedArray.length-1;while (this.sortedArray[i] < 0 && i > 0) {i--;}while (this.sortedArray[j] > 0 && j > 0) {j--;}do {if (this.sortedArray[i] + this.sortedArray[j] == this.k) {this.indexI = i;this.indexJ = j;this.bSuccessed = true;break;}if (this.sortedArray[i] + this.sortedArray[j] > k) {i--;while (i > 0 && this.sortedArray[i] < 0) {i--;}} else {j--;while (j > 0 && this.sortedArray[j] > 0) {j--;}}}while(i > 0 && j > 0);}public void findPair() {this.findPairWithSameSign(true);if (this.bSuccessed == false) {this.findPairWithSameSign(false);}if (this.bSuccessed == false) {this.findPairWithDifferentSign();}if (this.bSuccessed == false) {System.out.println("No such pair exist in  array");} else {System.out.println("The index are " + this.indexI + " and " + this.indexJ + " with value of " + this.sortedArray[this.indexI] + " and " + this.sortedArray[this.indexJ]);}}
}

類FindPairInAbsoluteSortedArray用于在絕對值排序的數組中查找滿足條件的元素配對,它先根據兩元素都是正數的情況下查找,然后再根據兩元素都是負數的情況下查找,如果這兩種情況都找不到,再嘗試兩元素一正一負的情況下查找,如果三種情況都找不到滿足條件的元素,那么這樣的元素在數組中不存在。

我們看看入口代碼:


public class Searching {public static void main(String[] args) {int[] A = {-49, 75, 103, -147, 164, -197, -238, 314, 348, -422};int k = 167;FindPairInAbsoluteSortedArray fi = new FindPairInAbsoluteSortedArray(A, k);fi.findPair();}
}

上面代碼運行結果如下:?
這里寫圖片描述

從運行結果上看,我們算法的實現是正確的,并且這種做法比原先依靠折半查找的效率要高,它的算法復雜度為O(n),空間復雜度為O(1)。

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

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

相關文章

QT Linux打包發布

Linux&#xff1a; 1、用Release編譯&#xff1b; 2、把可執行文件(如paike)放入新建目錄中; 3、當前目錄下編寫腳本copyDependency.sh&#xff0c;把動態鏈接庫導入當前目錄&#xff1b; #!/bin/shexe"paike" #發布的程序名稱destination"/home/paike"…

CRM公海自動回收規則

企微云CRM操作指南 – 道一云|企微https://wbg.do1.com.cn/xueyuan/2568.html 銷售云 - 美洽 - 連接客戶&#xff0c;親密無間https://meiqia.com/sales-cloud 轉載于:https://www.cnblogs.com/rgqancy/p/10695466.html

三分鐘看懂一致性哈希算法

一致性哈希算法&#xff0c;作為分布式計算的數據分配參考&#xff0c;比傳統的取模&#xff0c;劃段都好很多。 在電信計費中&#xff0c;可以作為多臺消息接口機和在線計費主機的分配算法&#xff0c;根據session_id來分配&#xff0c;這樣當計費主機動態伸縮的時候&#xf…

數據結構09圖

第七章 圖 Graph 7.1 圖的定義和術語 頂點 Vertex V 是頂點的有窮非空集合&#xff0c;頂點數 |V| n VR 兩個頂點之間關系的集合&#xff0c;邊數 |VR| e 有向圖 Digraph <v, w> Arc v Tail / Inital node w Head / Terminal node 無向圖 Undigraph <v, w> 必…

JVM調優-GC參數

一、Throughput收集器(吞吐量) -XX:UseParallelGC -XX:UseParallelOldGC *參數調整&#xff1a;通過調整堆大小&#xff0c;減少GC停頓時間&#xff0c;增大吞吐量 增強堆大小可以減少Full GC頻率&#xff0c;但卻會增加停頓時間 1.手動調整 -Xmn -Xms -XX:NewRatioN 手動指…

aspnetcore源碼學習(一)

---恢復內容開始--- 筆者從事netcore相關項目開發已經大半年了&#xff0c;從netcore 1.0到現在3.0大概經過了3年左右的時間&#xff0c;記得netcore剛出來的時候國內相關的學習資料缺乏&#xff0c;限制于外語不大熟練的限制國外的相關書籍看起來相當吃力&#xff0c;于是在當…

評估一個垃圾收集(GC)

在實踐中我們發現對于大多數的應用領域&#xff0c;評估一個垃圾收集(GC)算法如何根據如下兩個標準&#xff1a; 吞吐量越高算法越好暫停時間越短算法越好 首先讓我們來明確垃圾收集(GC)中的兩個術語:吞吐量(throughput)和暫停時間(pause times)。 JVM在專門的線程(GC threads…

python數據分析常用包之Scipy

Scipy轉載于:https://www.cnblogs.com/jacky912/p/10697853.html

docker容器狀態跟蹤及疑惑

一、 1 def status_test():2 container client.containers.create("comp")3 print ("create: ", container.status)4 container.start()5 print ("start: ", container.status)6 container.pause()7 print ("paus…

CAP和BASE理論

幾個名詞解釋&#xff1a; 網絡分區&#xff1a;俗稱“腦裂”。當網絡發生異常情況&#xff0c;導致分布式系統中部分節點之間的網絡延時不斷變大&#xff0c;最終導致組成分布式系統的所有節點中&#xff0c;只有部分節點之間能夠進行正常通信&#xff0c;而另一些節點則不能…

Mysql案例5:取得平均薪資最高的部門的部門名稱

一、要求&#xff1a;查詢平均薪水最高部門的部門編號 二、背景&#xff1a;當前數據庫有employee表和department表&#xff0c;數據分別如下&#xff1a; employee表&#xff1a; department表&#xff1a; 三、難點&#xff1a; 1、需要考慮最高平均薪資可能在多個部門同時出…

Spring 處理過程分析

一、處理過程分析 1、首先&#xff0c;Tomcat每次啟動時都會加載并解析/WEB-INF/web.xml文件&#xff0c;所以可以先從web.xml找突破口&#xff0c;主要代碼如下&#xff1a;<servlet ><servlet-name >spring-mvc</servlet-name><!-- servlet類 --><…

python全棧開發中級班全程筆記(第二模塊、第四章)(常用模塊導入)

python全棧開發筆記第二模塊 第四章 &#xff1a;常用模塊&#xff08;第二部分&#xff09; 一、os 模塊的 詳解 1、os.getcwd() &#xff1a;得到當前工作目錄&#xff0c;即當前python解釋器所在目錄路徑 import os j os.getcwd() # 返回當前pyt…

基于 Spring Cloud 完整的微服務架構實戰

本項目是一個基于 Spring Boot、Spring Cloud、Spring Oauth2 和 Spring Cloud Netflix 等框架構建的微服務項目。 作者&#xff1a;Sheldon地址&#xff1a;https://github.com/zhangxd1989 技術棧 Spring boot - 微服務的入門級微框架&#xff0c;用來簡化 Spring 應用的初…

mysql Invalid use of group function的解決辦法

錯誤語句&#xff1a;SELECT s.SID, s.Sname, AVG(a.score)FROM student sLEFT JOIN sc a ON s.SID a.SID WHERE AVG(a.score) > 60GROUP BY s.SID正確語句&#xff1a; SELECTs.SID,s.Sname,AVG(a.score)FROMstudent sLEFT JOIN sc a ON s.SID a.SID GROUP BYs.SID HAVIN…

ipython notebook 中 wavefile, display, Audio的使用

基于ipython notebook的 wavefile以及display, Audio的使用首先是使用的庫使用 wavfile 讀取.wav文件使用display,Audio播放聲音最近在做聲音信號處理的時候&#xff0c;使用了ipython notebook。發現相較于matlab&#xff0c;python在有關生成wave文件和播放音頻需要利用到sci…

spring 設計模式

設計模式作為工作學習中的枕邊書&#xff0c;卻時常處于勤說不用的尷尬境地&#xff0c;也不是我們時常忘記&#xff0c;只是一直沒有記憶。 今天&#xff0c;螃蟹在IT學習者網站就設計模式的內在價值做一番探討&#xff0c;并以spring為例進行講解&#xff0c;只有領略了其設計…

Ansible-----循環

with_dict迭代字典項 使用"with_dict"可以迭代字典項。迭代時&#xff0c;使用"item.key"表示字典的key&#xff0c;"item.value"表示字典的值。 ---- hosts: localhosttasks:- debug: msg"{{item.key}} & {{item.value}}"with_di…

ROS(Robot Operating System)筆記 : 1.使用launch file在gazebo中生成urdf機器人

ROS(Robot Operating System) 1.使用launch file在gazebo中生成urdf機器人 最近接觸了ROS(Robot Operating System),發現單單學習官網http://wiki.ros.org/上的教程&#xff0c;在實際操作過程中仍然會遭遇許多困難。這一系列關于ROS的文章記錄了ROS學習過程中可能遇到的問題…

[asp.net] 利用WebClient上傳圖片到遠程服務

一、客戶端 1.頁面 <form id"Form1" method"post" runat"server" enctype"multipart/form-data">     <input id"MyFile" type"file" runat"server" />     <br />     …