具體的演算法描述如下:給出乙個數,求出由每位數形成的所有全排列中,大於此數的最小值
注:我們給出的這個數每位都不同
/**
* * 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 ...