算法设计与分析
终把泪酿酒~
艰苦小白的编程之路
展开
-
面试题36:二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。(这道题真的很考察思路、代码其实不是很难,就是指针很多,容易眼花,所以真的是质量很高的一道题)思路1、因为是二叉搜索树,所以左子树比根值小,右子树比根值小,这就是一个突破口2、那自然想到我们排序的值应按先左子树再根再右子树,所以就用到中序遍历3、采用递归就可以很好地...原创 2020-03-08 17:17:00 · 115 阅读 · 0 评论 -
动态规划之切割绳子
/* 切割绳子,每段绳子都有一个最大值,给定长度为n的绳子,如何切割让利益最大化 自底而上的方法,对于任何子问题,直至它依赖的所有子问题都解决,才会去解决它。*/#include<iostream>#include<algorithm>#include<vector>using namespace std;vector<int&...原创 2018-04-07 21:03:04 · 1742 阅读 · 0 评论 -
分治法之归并排序三种实现方法(递归、非递归和自然合并排序)
1. 递归实现归并排序基本思想:将待排元素分成大小大致相同的2个子集,分别对2个子集合进行排序,最终将排好序的子集合合并 就会得到一个排好序的集合 即为所求设归并排序的当前区间是R[low..high],分治法的三个步骤是: ① 分解:将当前区间一分为二,即求分裂点 ② 求解:递归地对两个子区间R[low..mid]和R[mid+1..high] 进行归并排序; ③ ...转载 2018-04-08 19:18:18 · 10360 阅读 · 4 评论 -
合并两个有序数组,要求时间复杂度为O(n),且只要到O(1)的辅助空间
i= 0表示有序数组arr1的首元素,j = 未知,表示有序数组arr2的首元素 ①首先比较第一个有序数组arr1和第二个有序数组arr2第一个元素的大小 如果arr1[i] < arr[j],i++ 否则 index记住j的位置,index就是j变化之前的位置 ②如果arr2[j] < arr[i],证明后面的元素小于后面的元素,需要进行往前的置换,所以j++,但是要保证j+...原创 2018-04-08 22:40:31 · 5261 阅读 · 0 评论 -
动态规划之矩阵练乘加括号问题
/*因为相乘顺序会影响标量的乘法大小,所以加括号的位置非常影响乘法结果的大小*/#include<iostream>using namespace std;void matrix_chain_order(int *p,int m[][1000],int s[][1000],int n);void print(int s[][1000],int i,int j);int ...原创 2018-04-09 18:32:03 · 1445 阅读 · 1 评论 -
经典算法之子数组换位问题
子数组换位问题 设a[0:n-1]是一个有n个元素的数组,k(0<=k<=n-1)是一个非负整数。 试设计一个算法将子数组a[0:k]与a[k+1,n-1]换位。要求算法在最坏情况下耗时O(n),且只用到O(1)的辅助空间。初步思考:最简单的方法就是循环(n-k-1)次,将a数组的末...转载 2018-04-03 22:49:49 · 886 阅读 · 1 评论 -
leetcode contest95 879.盈利计划
879. 盈利计划帮派里有 G 名成员,他们可能犯下各种各样的罪行。第 i 种犯罪会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与。让我们把这些犯罪的任何子集称为盈利计划,该计划至少产生 P 的利润。有多少种方案可以选择?因为答案很大,所以返回它模 10^9 + 7 的值。示例 1:输入:G = 5, P = 3, group = [2,2], ...原创 2018-07-30 21:41:40 · 1066 阅读 · 0 评论