算法
Ther Meng
这个作者很懒,什么都没留下…
展开
-
三数之和
题目描述给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2]]思路先对数组排序。O(nlogn)使用两个循环,外层循环用于控制每次必须存在的数。内层循环用于寻找两外两个元素,使得和为0。原创 2020-07-16 13:04:13 · 140 阅读 · 0 评论 -
二叉树的路径总和
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ /*给...原创 2020-05-03 16:12:45 · 210 阅读 · 0 评论 -
删除字符串s1 中在字符串s2 中出现的字符(C++)
#include <iostream>#include <string>#include <set>using namespace std;int main(){ string s1="welcome"; string s2="wel"; set<char> t; //将s1中的数据全部存入set中 ...原创 2020-05-03 15:39:40 · 1493 阅读 · 0 评论 -
BST树元素区间搜索问题
由于BST的中序遍历的性质,遍历完成之后是一个有序的序列所以,在有序的序列当中查找某个区间当中的元素是非常容易的,我们可以简单的运用递归来实现这个操作//在区间[l...r]中搜索元素void findValues(Node *node,int l,int r){ if(node!=nulptr) { findValues(node->left,l,r); //L //...原创 2020-04-27 15:52:42 · 232 阅读 · 0 评论 -
大数的加减法
#include "pch.h"#include <iostream>#include <string>#include <algorithm>using namespace std;#if 0// 编程题目:请实现以下类的方法,完成大数的加减法class BigInt{public: BigInt(string str) :strDigi...原创 2020-04-10 13:48:38 · 307 阅读 · 0 评论 -
深度遍历迷宫搜索C++实现
// 深度遍历迷宫路径搜索.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include "pch.h"#include <iostream>#include <stack>using namespace std;#if 0/*深度遍历搜索迷宫路径,软件运行要求如下:请输入迷宫的行列数(例如:10 10):5 5请输...原创 2020-04-09 15:08:09 · 849 阅读 · 0 评论 -
C++快速排序quicksort
int Partition2(int *arr,int l,int r)//针对有大量重复的情况下的优化{ swap(arr[l],arr[rand()%(r-l+1)+l]); int v=arr[l]; //arr[l+1...i]<=v; arr[j...r]>=v int i=l+1; int j=r; while(1) ...原创 2020-02-07 15:42:11 · 240 阅读 · 0 评论 -
C++选择排序插入排序冒泡排序
void selectionsort(int *arr,int n){ for(int i=0;i<n;i++) { int minindex=i; for(int j=i;j<n;j++) { if(arr[j]<arr[minindex]) { ...原创 2020-02-07 15:35:46 · 129 阅读 · 0 评论 -
2-3树与红黑树
对于三节点来说,比b小的在左边,比c大的在右边,处于b和c之间的在中间绝对平衡的树:每个节点的左右子树的高度一样每次插入节点的时候,绝对不能破坏2-3树的绝对平衡性总之就是先进行融合,之后再进行拆解红黑树与2-3树类似,只是把三节点表示成了一个黑节点和一个红节点每个红色节点都是左倾斜的由于红黑树的最大高度是2logn,AVL树的高度为logn,所以在查找的时候红黑树可...原创 2020-03-14 18:36:06 · 169 阅读 · 0 评论 -
AVL树的原理以及旋转操作
原创 2020-03-14 14:52:23 · 136 阅读 · 0 评论 -
线段树以及Trie的总结
所谓线段树,就是在要求求解某个大问题的某个区间的小问题的时候,我们可以采用的一种数据结构Trie,也叫字典树,前缀树,是用来查询某个单词或者某个字符串的一种数据结构用trie来查询某个单词,查询的时间复杂度只与这个单词的长度有关,因此查询效率非常高实现一个Trie:class Trie {private: bool is_string = false; Trie ...原创 2020-03-13 17:47:38 · 332 阅读 · 0 评论 -
LeetCode关于二叉树的习题汇总及解法
LeetCode222:给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例:输入:1/ 2 3/ \ /4 5 6输出: 6class Solution {public:...原创 2020-03-11 19:25:03 · 312 阅读 · 0 评论 -
二叉搜索树的前序、中序、后序遍历(非递归实现)
/*用递归写二叉树的遍历是很容易的,但是用非递归的话实现就相对来说比较复杂了。首先,递归的本质也是压栈出栈的过程,所以我们可以用一个栈来模拟系统的递归过程。比如我们要打印如下的二叉树: 1 / \ 2 3拿前序遍历来说,我们首先我访问1,然后访问1的左,然后访问1的右我们可以用一个栈来记录我们的操作首先我们要把访问1这个节点,所以我们要将访问1这个...原创 2020-03-07 22:10:44 · 250 阅读 · 0 评论 -
LeetCode150:逆波兰表达式求值
/*根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: ["2", "1", "+", "3", "*"]输出: 9解释: ((2 + 1) * 3) = 9示例 ...原创 2020-03-07 19:59:52 · 92 阅读 · 0 评论 -
LeetCode61:旋转链表
/*给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->...原创 2020-03-04 17:25:02 · 96 阅读 · 0 评论 -
LeetCode19:删除链表的倒数第N个节点
/*给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.*/class Solution {public: ListNode* removeNthFromEnd(ListNode* head,...原创 2020-03-04 16:50:33 · 96 阅读 · 0 评论 -
LeetCode237:删除链表中的节点
/*请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。现有一个链表 -- head = [4,5,1,9],请删除这个链表的node节点*//*由于我们无法得到这个链表,所以我们将要删除的node节点的val置为node的next的val,之后我们将node的next节点删除就可以*/class Solution {public: vo...原创 2020-03-03 20:00:04 · 77 阅读 · 0 评论 -
LeetCode147:对链表进行插入排序
/* 对链表进行插入排序 *//*先new一个虚拟的头结点pre,让tail指向第一个节点,让node指向第二个节点。 pre tail node 3 -> 6 -> 5 -> 8 -> NULL 如果发现node->val > tail->next, 那么tail和nod...原创 2020-03-03 15:33:20 · 149 阅读 · 0 评论 -
LeetCode24:两两交换链表中的节点
/*给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例:给定 1->2->3->4, 你应该返回 2->1->4->3.*//*先声明一个虚拟节点dummyhead指向头结点,之后让p指向dummyhead,node1指向p->next,node2指向p-&g...原创 2020-03-03 14:16:09 · 103 阅读 · 0 评论 -
LeetCode82:删除排序链表中的重复元素||
/*给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例 2:输入: 1->1->1->2->3输出: 2->3*/class Solution {public: ListN...原创 2020-03-01 15:36:20 · 99 阅读 · 0 评论 -
LeetCode203:删除链表值为val的元素
/*删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5 */class Solution {public: ListNode* removeElements(ListNode* head, int val) { ...原创 2020-03-01 14:41:21 · 107 阅读 · 0 评论 -
LeetCode328:奇偶链表
/*给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5-&g...原创 2020-03-01 14:03:20 · 101 阅读 · 0 评论 -
LeetCode86:分隔链表
/*给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5*//*遍历一遍链表,将<x的放在链表1中,将&g...原创 2020-03-01 13:09:47 · 93 阅读 · 0 评论 -
LeetCode83:删除排序链表中的重复元素
/*给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3*/class Solution {public: ListNode* deleteDuplicates(ListNode* hea...原创 2020-02-29 17:40:59 · 126 阅读 · 0 评论 -
LeetCode92:反转链表II
/* 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL */ /* */class Solution {public: Lis...原创 2020-02-29 14:02:45 · 96 阅读 · 0 评论 -
LeetCode206:反转链表
/*反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL*//*pre cur nextNULL 1 -> 2 -> 3 -> 4 -> 5 -> NULL 我们用三个指针,pre初...原创 2020-02-28 15:17:33 · 69 阅读 · 0 评论 -
LeetCode220:存在重复元素III
/*给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。示例 1:输入: nums = [1,2,3,1], k = 3, t = 0输出: true示例 2:输入: nums = [1,0,1,1], k = 1, t = 2输出: true示例 3:...原创 2020-02-28 14:27:10 · 587 阅读 · 0 评论 -
LeetCode219:存在重复元素II
/*给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。示例 1:输入: nums = [1,2,3,1], k = 3输出: true示例 2:输入: nums = [1,0,1,1], k = 1输出: true示例 3:输入: nums = [1,2,3,...原创 2020-02-28 13:54:09 · 98 阅读 · 0 评论 -
LeetCode202:快乐数
/* 编写一个算法来判断一个数是不是“快乐数”。 一个“快乐数”定义为:对于一个正整数, 每一次将该数替换为它每个位置上的数字的平方和, 然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。 如果可以变为 1,那么这个数就是快乐数。 示例: 输入: 19 输出: true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 8...原创 2020-02-26 16:30:56 · 112 阅读 · 0 评论 -
LeetCode242:有效的字母异位词
/* leetcode 438 76(滑动窗口)不会*//*给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false 说明: 你可以假设字符串只包含小写字母。 */...原创 2020-02-26 13:57:07 · 100 阅读 · 0 评论 -
LeetCode350:两个数字的交集II
/*给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9] *//* 由于这次我们要输出所有的交集,包括重复的数字, 所以我们就要声明一个map,用来记录每个...原创 2020-02-25 20:22:47 · 204 阅读 · 0 评论 -
LeetCode349:两个数组的交集
/*给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [9,4] *//*我们将nums1中的数据全部存储到一个set中,因为set默认是不能重复的,如果有重复的,则默...原创 2020-02-25 19:35:21 · 101 阅读 · 0 评论 -
LeeetCode3:无重复字符的最大长度
/* 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解...原创 2020-02-25 15:43:40 · 131 阅读 · 0 评论 -
LeetCode209:长度最小的子数组
/* 给定一个含有 n 个正整数的数组和一个正整数 s , 找出该数组中满足其和 ≥ s 的长度最小的连续子数组。 如果不存在符合条件的连续子数组,返回 0。 示例: 输入: s = 7, nums = [2,3,1,2,4,3] 输出: 2 解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。 *//* 维护一个从l到r的滑动窗口,如果当前的sum小于s...原创 2020-02-23 16:10:04 · 127 阅读 · 0 评论 -
LeetCode11:盛水最多的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。class Solution {public: int maxArea(vector&...原创 2020-02-23 15:37:49 · 89 阅读 · 0 评论 -
LeetCode125:验证回文串
/* 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 2: 输入: "race a car" 输出: false */#include <iostream&...原创 2020-02-23 14:49:44 · 92 阅读 · 0 评论 -
LeetCode167:Two Sun II-输入有序的数组
/* 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例: 输入: numbers = [2,...原创 2020-02-23 14:32:51 · 79 阅读 · 0 评论 -
如何设计一个公平的洗牌算法
什么叫公平呢?一旦你开始思考这个问题,其实答案不难想到。洗牌的结果是所有元素的一个排列。一副牌如果有 n 个元素,最终排列的可能性一共有 n! 个。公平的洗牌算法,应该能等概率地给出这 n! 个结果中的任意一个。如思考虑到这一点,我们就能设计出一个简单的暴力算法了:对于 n 个元素,生成所有的 n! 个排列,然后,随机抽一个。这个算法绝对是公平的。但问题是,复杂度太高。复杂度是多少呢?O(n!)...原创 2020-02-23 14:03:56 · 803 阅读 · 0 评论 -
LeetCode215:数组中的第k个最大的元素
/* 在未排序的数组中找到第 k 个最大的元素。请注意, 你需要找的是数组排序后的第 k 个最大的元素, 而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4*/#include <iostream>#inclu...原创 2020-02-22 21:57:54 · 95 阅读 · 0 评论 -
LeetCode88:合并两个有序数组
/* 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0], m...原创 2020-02-22 20:36:07 · 72 阅读 · 0 评论