讀書筆記 漫畫演算法 6 尋找全排列的下乙個數

2021-09-29 12:15:31 字數 2573 閱讀 7414

給出乙個數,求出由每位數形成的所有全排列中,大於此數的最小值

注:我們給出的這個數每位都不同

具體的演算法描述如下:

/**

* * 1. 從後向前尋找逆序區域,並返回逆序區域的最左側索引

* 2. 將nums[index-1]與nums區間[index, nums.length-1]中大於nums[index-1]的最小元素進行位置交換

* 3. 將陣列nums區間[index, nums.length-1]逆序

** 舉個例子:12354

* 1. 找到逆序區域123|54| ,最左側索引index = 3

* 2. 將3與4進行交換,得到124|53這樣保證最高位能夠最小

* 3. 將逆序區間順序得到:124|35

*/

演算法實現如下:

首先定義乙個抽象類,方便表示整個演算法的流程:

public

abstract

class

templatefindnearestnumber

templatefindnearestnumber

(int

arr)

/** * 1. 從後向前尋找逆序區域,並返回逆序區域的最左側索引

* 2. 將nums[index-1]與nums區間[index, nums.length-1]中大於nums[index-1]的最小元素進行位置交換

* 3. 將陣列nums區間[index, nums.length-1]逆序

* @return

*/public

int[

]findnearestnumber()

int[

] copynums = arrays.

copyof

(arr, arr.length)

;exchangehead

(copynums, index)

;reverse

(copynums, index)

;return copynums;

}/**

* 從後向前尋找逆序區域,並返回逆序區域的最左側索引

* @param nums

* @return

*/protected

abstract

intfindreversedorderborderindex

(int

nums)

;/**

* 將nums[index-1]與nums區間[index, nums.length-1]中

* 大於nums[index-1]的最小元素進行位置交換

* @param nums

* @param index

*/protected

abstract

void

exchangehead

(int

nums,

int index)

;/**

* 將陣列nums區間[index, nums.length-1]逆序

* @param nums

* @param index

*/protected

abstract

void

reverse

(int

nums,

int index)

;}

再定義核心的演算法實現,其中最後的main函式,對整個演算法進行測試

public

class

findnearestnumber

extends

templatefindnearestnumber

@override

public

intfindreversedorderborderindex

(int

nums)

return index;

}@override

protected

void

exchangehead

(int

nums,

int index)}}

@override

protected

void

reverse

(int

nums,

int index)

}private

void

swap

(int

arr,

int i,

int j)

public

static

void

main

(string[

] args)

; templatefindnearestnumber solution = null;

for(

int i =

0; i <

10; i++)}

}

讀書筆記 漫畫演算法 9 A 尋路演算法

a 尋路演算法的講解,這裡有介紹比較清晰的文章 首先引入兩個集合,乙個公式 演算法執行的大致步驟如下 下面是a 演算法的完整實現,並帶有測試用例 a 演算法 啟發式搜尋 首先引入兩個集合,乙個公式 openlist 可到達的格仔 closelist 已到達的格仔 f g h 每乙個格仔都有三個屬性值...

讀書筆記 漫畫演算法 8 LRU快取的實現

lru,least recently used,最近最少使用 一種資源管理演算法 按照字面的意思,也可以理解為快取淘汰演算法 最近最少訪問的資源,我們就從快取中淘汰出去,以免長時間占用記憶體且不經常訪問 首先,我們定義基礎的資料結構 public class lrucache 用於高效訪問的hash...

演算法導論讀書筆記(6)堆排序

複雜度o nlgn 原址排序 集插入排序和歸併排序兩者的優點 計算給定節點下標i的父,左孩子,右孩子的下標 parent i return i 2 left i return 2i right i return 2i 1 最大堆 堆中最大元素存放在根結點 最小堆 堆中最小元素存放在根結點 從a i ...