Leetcode 801 使序列遞增的最小交換次數

2022-06-12 15:39:11 字數 1875 閱讀 5152

回溯搜尋:

/**

* @author niuxy

* @date 2020/7/12 6:41 下午

* @description 回溯法, 暴力搜尋

*/public

int minswap0(int a, int

b) minswap(a, b, 0, 0);

return

an; }

int an =integer.max_value;

public

void minswap(int a, int b, int point, int

nums)

return

; }

change(a, b, point);

minswap(a, b, point + 1, nums + 1);

change(a, b, point);

minswap(a, b, point + 1, nums);

}private

void change(int a, int b, int

point)

private

boolean isincrease(int

nums)

for (int i = 1; i < nums.length; i++)

}return

true

; }

剪枝分治:

/**

* @author niuxy

* @date 2020/7/12 7:10 下午

* @description 回溯演算法的回溯點在於,每次交換元素後,該操作會對後續的判斷產生影響

* 題目要求求最小交換次數,也就是說經過有限次數的交換,兩個數列最終一定會嚴格遞增

* 每個元素小於其相鄰的後續元素是數列嚴格遞增的充分條件

* 可以通過不斷比較相鄰的兩個元素來判斷數列是否遞增

* 可以通過將可能被交換的元素儲存在遞迴函式入參中,來替代回溯

* 每個元素只有兩種選擇,交換與不交換,那麼:

* 1,當 a,b 在該元素上不是嚴格遞增的,必須交換(剪枝)

* 2,否則有交換與不交換兩種可能

* 遍歷每個元素,求它們所有可能選擇集合的笛卡爾積

* 2 情況會導致計算過程中存在重複計算,通過快取避免

* 相比於回溯的暴力搜尋,通過對元素區分情況 1,2 進行了剪枝,避免了部分無效計算

* 同時通過快取避免了部分重複計算

801 使序列遞增的最小交換次數

我們有兩個長度相等且不為空的整型陣列 a 和 b 我們可以交換 a i 和 b i 的元素。注意這兩個元素在各自的序列中應該處於相同的位置。在交換過一些元素之後,陣列 a 和 b 都應該是嚴格遞增的 陣列嚴格遞增的條件僅為a 0 a 1 a 2 a a.length 1 給定陣列 a 和 b 請返回...

801 使序列遞增的最小交換次數

我們有兩個長度相等且不為空的整型陣列 nums1 和 nums2 在一次操作中,我們可以交換 nums1 i 和 nums2 i 的元素。例如,如果 nums1 1,2,3,8 nums2 5,6,7,4 你可以交換 i 3 處的元素,得到 nums1 1,2,3,4 和 nums2 5,6,7,8...

leecode 801 使序列遞增的最小交換次數

我們有兩個長度相等且不為空的整型陣列 a 和 b 我們可以交換 a i 和 b i 的元素。注意這兩個元素在各自的序列中應該處於相同的位置。在交換過一些元素之後,陣列 a 和 b 都應該是嚴格遞增的 陣列嚴格遞增的條件僅為a 0 a 1 a 2 a a.length 1 給定陣列 a 和 b 請返回...