快速排序、
算法思想
1、选取第一个数为基准
2、将比基准小的数交换到前面,比基准大的数交换到后面
3、对左右区间重复第二步,直到各区间只有一个数
参考链接:优雅的快排
int PartSort1(int* a, int left, int right)
{
int key = left;//取最左边的元素做key
while (left < right)//当左右没有相遇
{
while (left < right && a[right] >= a[key])//如果右比key小就退出循环
right--;
while (left < right && a[left] <= a[key])//如果左比key大就退出循环
left++;
swap(&a[left], &a[right]);//交换左右
}
swap(&a[key], &a[left]);//交换key和相遇位置的元素
return left;//返回key的位置
}
算法 我的噩梦。
作者:Nehzil
参考答案
class Solution {
public:
/**
* 1. 确定dp数组下标含义 分拆数字i,可以得到的最大乘积为dp[i];
* 2. 递推公式 dp[i] = max(dp[i], (i - j) * j, dp[i - j] * j);
* 3. 初始化 dp[2] = 1;
* 4. 遍历顺序 从前向后遍历就可以;
* 5. 推导结果;
*/
int integerBreak(int n) {
/* 定义dp数组 */
vector<int> dp(n + 1);
/* dp数组初始化 */
dp[2] = 1;
/* 从前向后遍历 */
for (int i = 3; i <= n ; i++) {
/* j遍历到小于i的值 */
for (int j = 1; j < i - 1; j++) {
dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
}
}
return dp[n];
}
};