1、抽屉原理:n+1 个苹果放在 n 个抽屉里,那么至少有一个抽屉中会放两个苹果。
2、分治法:
分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;
合并:将各个子问题的解合并为原问题的解。
例子:快速排序就用到了分治法。
1)找一个中间位,所有比他小的放一个数组,所有比他大的放一个数组,然后两个数组再次递归。中间位可以是数组的中间位置的,也可以是数组开头或者结尾的。
var quickSort = function (nums) {
if(nums.length <= 1){
return nums;
}
var n = nums.length;
var left = [];
var right = [];
// mid可以取固定的中间位置的,也可以取数组开头的或者结尾的
var mid = parseInt(n/2);
for(var i = 0; i < n; i++){
if(nums[i] <= nums[mid] && i !== mid){
left.push(nums[i]);
}else if(i !== mid){
right.push(nums[i]);
}
}
return quickSort(left).concat([nums[mid]], quickSort(right));
};
2)原地快排:找一个基准点,一般选择数组的首位比较方便,一轮循环的目标就是循环下来基准点的左边小于等于它,基准点的右边比它大。
// 原理:https://blog.csdn.net/danting1126/article/details/61627737
// 为何从右开始:https://blog.csdn.net/lkp1603645756/article/details/85008715