- 博客(14)
- 收藏
- 关注
原创 快速排序三步曲
快速排序的思路十分简单,只有三步曲:1.确定临界值2.调整区间3.递归处理数组的左段和右段最关键的是第二步,如何调整区间,即把大于x的数放在x的左边,把小于x的数放在x的左边。比较容易想到的方法是用两个数组,将大于x的数放在一个数组中,小于x的数放在另一个数组中。还有一种方法是双指针。待排数组为num[]i指向left-1j指向right+1当num[i]<x时 i++当num[j]>x时 j–当num[i]>=x时 i指针不变当num[j]<=x时 j指针
2022-03-05 22:38:24 237
原创 20. 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。输入:s = “()”输出:true输入:s = “()[]{}”输出:true输入:s = “(]”输出:false输入:s = “([)]”输出:false输入:s = “{[]}”输出:true思路:这种涉及括号的题一般可以用栈来解决。1.遍历字符串,如果是左括号,则入栈对应的右括号。
2022-02-09 11:44:22 5936
原创 力扣19. 删除链表的倒数第 N 个结点
删除链表的倒数第 N 个结点给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]思路1:双指针这种链表的第几个结点问题,一般采用双指针的方法来解决。1.为了删除方便,创建一个哑结点,作为新的头结点,后指针指向哑结点,前指针指向原来的头结点2.先将前指针移动n步,这样,前指针走到末尾时,后指针刚好指向倒数第n个结点的前一个结点。3.前后指针一起移动,直到后指针指向链表末尾4.删除后指针后一个.
2022-02-08 22:17:48 411
原创 力扣02. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.思路:1.记录两个链表的长度2.在较短链表的后面补上0,使得两个链表的长度相等(逆序排列情况下)3.对每位上的数字进行求和,并进位。/**
2022-02-08 19:01:36 64
原创 力扣01两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案思路1:双循环遍历数组,一个一个找,对于数组中的任一元素,遍历后面的元素,看是否满足和为目标值,如果满足则返回这两个数在数组中的位置。代码如下:class Solution {public: vector<int> twoSu
2022-02-07 21:50:21 76
原创 力扣64.最小路径和
题目入口这题属于最基本的动态规划入门题,按照动态规划的的一般思路做就可以了。代码加注释如下class Solution {public: int minPathSum(vector<vector<int>>& grid) {//如果矩阵为0,则返回0if(grid.size()==0||grid[0].size()==0){ return 0 ;}//行数int rows = grid.size();//列数int cols = gri
2022-01-21 21:38:36 315
原创 力扣136找出出现次数为一的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。示例 :输入: [2,2,1]输出: 1思路:直接异或就完事异或的性质,相同为0,不同为0,因此将数组的所有元素进行异或,出现两次的元素最后异或成为0,只出现一次的元素与0异或还是本身。class Solution {public: int singleNumber(vector<int>& nums) { int ret = 0;
2021-12-26 23:30:40 3202
原创 力扣114. 二叉树展开为链表
给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。输入:root = [1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,4,null,5,null,6]思路普通解法:先用vector将先序遍历的结果保存下来,再将二叉树展开为链表实现代码如下:先序遍历函数:void preor
2021-12-26 23:20:46 94
原创 如何计算一个数二进制里1的个数
给定一个数x,如何计算二进制中1的个数呢?令x&=(x-1),记录与运算的次数,直到x=0; public int countOnes(int x) { int ones = 0;//计数器 while (x > 0) //当x不等于0时 { x &= (x - 1); ones++; } return ones; }...
2021-12-26 10:48:30 274
原创 力扣11.盛最多水的容器
题目描述:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水解题思路:这里用双指针法。算法思路:用两个指针l,r指向数组的头和尾:int l = 0,r = height.size()-1;定义一个变量用来保存最后的结果,初始化为0:int ans = 0;接下来就是寻找最大容量的过程了,类似
2021-12-26 10:32:52 411
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人