自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(9)
  • 收藏
  • 关注

原创 leetcode 167 输入有序数组(双指针, 缩减搜索空间, c++)

题目描述: 直接上代码(代码都能看懂,接下来再说为什么代码是这样 ): class Solution { public int[] twoSum(int[] numbers, int target) { int low = 0; int high = numbers.length - 1; while (low < high) { int sum = numbers[low] + numbers[high];

2020-09-21 13:12:10 215

原创 121. 买卖股票的最佳时机(leetcode 121, c++)

题目描述: 思路: 此题使用动态规划求解。记录下前i - 1个数组元素中的最小值,最大差值就是前 i - 1 个元素的最大差值和当前元素减前i个数组元素中的最小值得到的差值中的大的那个。 即 前i天的最大收益 = max{前i-1天的最大收益,第i天的价格-前i-1天中的最小价格} 完整代码为: class Solution { public: int max1(int a, int b) { return a > b? a:b; } int maxP

2020-09-14 17:51:40 198

原创 合并两个有序数组(leetcode 88, c++)

题目描述: 思路:这个题明显是利用二路归并排序的思想来做。先确定排序后数组的长度,而后比较两数组最后的元素,大的放入新数组的最后一位。 完整代码如下: class Solution { public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int i = m - 1; int j = n - 1; int k = m

2020-09-11 12:40:28 784

原创 加一(leetcode 66, c++)

思路:从最后一位开始

2020-09-10 18:53:29 205

原创 汉诺塔问题(递归,c++)

问题描述: 三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 汉诺塔问题一直都会写,但是以前其实不是很理解。今天就归纳总结一下。 先从简单的考虑, 若只有1个盘子,直接从A柱移到C柱即可。 若有2个盘子,则先将最上面的盘子移动到B柱,然后将下面的盘子移动到C柱,再将B柱的盘子移动到C柱。这就证明了两个盘子借助一根柱子可以移动到另一根柱子。 若有三个盘子,移动顺序为: A -> C A

2020-09-09 21:41:32 621

原创 01背包(动态规划, c++)

动态规划思想(如果只看题解,直接跳过这部分): 动态规划的核心思想是构造原问题最优解和子问题最优解之间的关系,即找出状态递推方程。也可以理解为寻找最优子结构。 动态规划一般求解步骤: 自底向上的顺序进行求解,或者说从易至难的顺序:先计算规模比较小或者说比较容易求解的子问题,并且把子问题的答案保存在状态数组中,规模比较大的或者说比较困难的子问题的答案则由已求解子问题的答案构造得到。 01背包问题: 思路: 1、先构造一张记录状态的表,即创建一个二维数组v[][],第一维是当前考虑的物品序号,第二维度是背包容

2020-09-09 11:19:06 487

原创 快速排序(分治,c++,白盒划分)

想要理解快速排序,首先要理解”一趟快速排序“,就是找一个记录,以它的关键字作为“枢轴”,凡其关键字小于枢轴的记录均移动至该记录之前,反之,凡关键字大于枢轴的记录均移动至该记录之后。 这样致使一趟排序之后,记录的无序序列R[s…t]将分割成两部分:R[s…i-1]和R[i+1…t],且 R[j].key(s≤j≤i-1)≤ R[i].key(枢轴 ) ≤ R[j].key(i+1≤j≤t) 一次快速排序代码下: 代码选用排序数组片段的第一个元素作为”枢轴“。 int sort(vector<int&gt

2020-09-08 16:36:37 409

原创 逆序对问题(分治,黑盒划分,c++)

看到这个问题,我的第一想法是枚举,时间复杂度是O(n^2),而使用分治则是O(nlogn)。下面讲一下分治的思路。 分治的话,肯定要将数组划分成更小的数组,比如将数组a[0-10]划分为a[0-5]和a[6-10]。 这样的话,逆序对就会出现在三个地方 1、a[0-5]内部,记为c1。 2、a[6-10]内部,记为c2。 3、a[0-5]和a[6-10]之间,记为c3。 很明显,随着划分,数组片段会越来越小,内部逆序对好求解,关键是两个数组片段之间的逆序对的求解。 也就是说,关键是合并两个数组片段之时数.

2020-09-08 11:18:33 361

原创 二路归并排序(分治,黑盒划分, c++)

二路归并排序(递归,c++) 思想:二路归并排序利用分治的思想,化繁为简,将数组分成一个个的元素,而后两两合并成新的数组片段,最后再将数组片段两两合并,直到合并成一个数组为止。 附上代码: 主要有两个函数,merge是将两个数组片段(即datas[low]到datas[mid],datas[mid + 1] 到datas[high])合并起来,buffers数组暂存数据。比较容易理解。 void merge(int datas[], int buffers[], int low, int mid, int

2020-09-08 09:40:48 719

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除