回溯搜尋:
/**剪枝分治:* @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 請返回...