算法和数据结构
算法和数据结构
你是你的你
这个作者很懒,什么都没留下…
展开
-
查找连续正数数列和为某个给定值的序列
// 在数组中查找某个和为连续正数数列的(至少两个)和为给定值// 思路:// 注意这里是连续的正数数列,因此如果采用O(n^2)遍历的方式会有大量重复计算// 可以利用去重复计算减少计算量,两个指针一个指向连续数列开始,一个指向连续数列结尾// 然后计算和,小于给定值则向后移动尾指针,大于则移动头指针int find_sum_num(int a[], int n, int k){ if (a == nullptr || n < 2 || k <= 0) {原创 2021-06-08 10:32:12 · 210 阅读 · 0 评论 -
查找数组中不重复的两个数
// 异或性质:// A^0=A// A^B=B^A// (A^B)^C=A^(B^C)// 另外,异或可以实现两个数字交换而不使用辅助空间:// A=A^B B=A^B A=A^B// 某个数组中除了两个数字,其他数字都是成对出现,请找出这两个数字// 普通方法包括两层循环遍历的时间复杂度为O(n^2)算法;或者使用哈希辅助数组统计,则需要额外的空间// 可以利用异或的性质来完成O(n)时间复杂度,O(1)空间复杂度// 思路:// 首先取得所有数字的异或结果,结果中二进制中第一个为1原创 2021-06-07 18:07:37 · 770 阅读 · 0 评论 -
判断一棵树是否二叉搜索树BST
// 判断二叉搜索树typedef struct binary_tree_node{ int value; BINARY_TREE_NODE* left; BINARY_TREE_NODE* right;}BINARY_TREE_NODE;bool is_valid_bst(BINARY_TREE_NODE* root){ if (root == nullptr) { return true; } return is_va原创 2021-06-07 16:56:46 · 83 阅读 · 0 评论 -
平衡二叉树判断和深度计算
// 二叉树可以分为普通二叉树,搜索二叉树(排序二叉树),平衡二叉树,完全二叉树,满二叉树// 搜索二叉树满足所有左子树的值都不大于根节点,所有右子树的值都不小于根节点,并且左右子树也都是搜索二叉树// 平衡二叉树指左右子树的深度差不大于1// 完全二叉树首先是一颗平衡二叉树,且满足所有叶子节点在最后最后两层,且最后一层的叶子节点靠左排列// 满二叉树首先是一颗完全二叉树,且满足节点个数为2^n - 1typedef struct binary_tree_node{ int value;原创 2021-06-05 12:11:54 · 535 阅读 · 0 评论 -
查找排序数组中某个给定数字的重复次数
// 查找一个排序数组中给定数组的重复次数// 排序查找,只需要查找到指定数字左边底标和右边底标,时间复杂度O(logn)// 借助二分查找,时间复杂度O(logn)int sorted_array_dup_num(int a[], int n, int k){ if (a == nullptr || n <= 0) { return -1; } int left = sorted_array_dup_num_left(a, 0, n - 1,原创 2021-06-05 11:28:25 · 268 阅读 · 0 评论 -
两个单链表交点问题以及单链表环入口问题及其应用在两个单链表交点查找
// 两个链表的第一个交点// 遍历对比方法时间复杂度为O(mn)// 分析,两个链表有交点,则交点后合并为一个链表,因此可以遍历时把两个链表节点放在两个栈中// 弹出对比直到最后一个相同点即为第一个公共交点,该方法时间复杂度O(m+n),空间复杂度O(m+n)// 另一种更好的方法,通过获取两个链表的长度,用两个指针,在较长的指针上先走n-m步长,然后两// 个指针同时遍历向后比较,找到第一个公共节点typedef struct list_node{ int value; L原创 2021-06-04 16:55:34 · 108 阅读 · 0 评论 -
归并排序及其merge和part函数以及应用逆序对
// 使用分治法// 归并排序的merge函数和part函数可以应用在其他地方int main() { int a[] = {3,6,7,2,5}; merge_sort(a, 5); return 0;}int merge_sort(int a[], int n) { if (a == nullptr || n <= 0) { return -1; } int ret = merge_sort_part(a, 0, n-1)原创 2021-06-03 21:02:09 · 165 阅读 · 0 评论 -
找数集中最小k个数
// 如果可以修改原数组,可以使用快排的patition函数int quick_sort_partition(int a[], int left, int right) { if (a == nullptr || left < 0 || right < 0 || left > right) { return -1; } int pivot = a[n-1]; int i = 0; int j = -1; for (i=0;原创 2021-06-02 17:48:45 · 62 阅读 · 0 评论