leetcode
admin``
这个作者很懒,什么都没留下…
展开
-
刷题笔记 | C++ | LeetCode最小的k个数
题目描述:链接输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]解题思想:参考链接全局排序,O(n*lg(n))局部排序,只排序TopK个数,O(n*k)堆,TopK个数也不排序了,O(n*lg(k))分治法,每个分支“都要”递归,例如:快速排序,O(n*lg(n))减治法,“只要”递归一个分支,例如:二分查原创 2021-03-20 16:31:22 · 239 阅读 · 0 评论 -
排序算法 | 堆排序
思想:首先维护一个大根堆,即保证一个二叉树的父节点比子节点都要大然后每次大根堆最顶上的那个数与最后那个数交换,把顶端的这个数保存下来。须知:对于一个长度为len的数组nums数组中最后一个父节节点为nums[len / 2 - 1]当父节点为nums[parent],其左节点为nums[2 * parent + 1],右节点为nums[2 * parent + 2];C++实现代码:#include <vector>#include <iostream>u原创 2021-03-20 16:03:05 · 125 阅读 · 0 评论 -
刷题笔记 | C++ | LeetCode5最长回文子串
LeetCode5最长回文子串题目描述链接给你一个字符串 s,找到 s 中最长的回文子串示例:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。解题思路中心扩散法:参考链接遍历字符串,找到以当前字符为中心的回文串。注意:回文串在长度为奇数和偶数的时候,“回文中心”的形式是不一样的。奇数串:bab偶数串:abba所以回文串的中心有可能为某个字符串,也可能为字符串的间隙兼容以上两种情况:如果传入重合的索引编码,进行中心扩散,此时得原创 2021-03-20 14:17:59 · 212 阅读 · 0 评论 -
排序算法 | 递归、非递归实现快速排序
C++代码实现如下:#include <vector>#include <iostream>#include <stack>using namespace std;int division(vector<int>& nums, int left, int right){ int base = nums[right]; while(left < right){ while(left < righ原创 2021-03-09 08:36:55 · 142 阅读 · 0 评论 -
刷题笔记_6 | 动态规划 | C++ | Leetcode152乘积最大子数组
Leetcode152乘积最大子数组题目描述给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。解题思路前提须知:负数x负数–>正数,正数x负数–>负数负数x较大的正数 < 负数x较小的正数,如 -2 x 3 < -2 x 2负数x较大的负数 < 负数x较小的负数,如 -2 x -3 < -2 x -5本题采用动态规划方法:对于每一个当前值nums[i],记录以其为结尾的子原创 2021-03-06 00:06:40 · 205 阅读 · 0 评论 -
刷题笔记_6 | 动态规划 | C++ | LeetCode53最大子序和
LeetCode53 最大子序和题目描述:链接给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。解题思路本题采用动态规划的方法:讨论以当前数字nums[i]为结尾,其所组成的子数组最大的加和sum[i]取决于 sum[i-1]是正还是负,sum[i] = max(sum[i-1] + nums[i], nums[i]),即:1、sum[i-1]为负数,以nums[i]结尾的最大子序和等于nums[i],因为如果加上sum[i-1],即为加上原创 2021-03-05 23:44:30 · 114 阅读 · 0 评论 -
刷题笔记_2 | 双指针 | C++ | LeetCode88合并两个有序数组
题目描述解题思路C++代码实现原创 2021-03-04 22:04:31 · 118 阅读 · 0 评论 -
刷题笔记_2 | 双指针 | C++ | LeetCode167
双指针用法双指针主要用于遍历数组,大多为两种用法1、两个指针移动方向相同,作为滑动窗口使用,经常用于区间搜索2、两个指针移动方向相对,可以用来搜索,待搜索的数组往往是排好序的。(此时某个指针的移动,相当于摒除了当前指针所指数字的所有组合,具体可参照本题)题目描述题目:链接给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数原创 2021-02-28 22:09:30 · 161 阅读 · 0 评论 -
刷题笔记_6 | 动态规划 | C++ | LeetCode300最长递增子序列
题目描述:题目:链接给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。解题思路:本题主要采用动态规划的方法:方法一,遍历的时候,记录以当前点为结尾的最长子序列,dp[i]原创 2021-02-27 11:00:25 · 266 阅读 · 0 评论 -
刷题笔记_1 | 贪心算法 | C++ | leetcode452
题目描述:链接解题思路:(和leetcode435问题很像,435的解题思路)1、首先先按直径的右边坐标从小到大排序2、变量p记录最前面一个的气球的右边坐标,只要当前气球左边的坐标大于p,则它们就能一起被射穿,否则p更新为当前坐标的右边坐标(即当前气球作为它们那一组的最前面的一个气球)C++代码实现class Solution {public: int findMinArrowShots(vector<vector<int>>& points) {原创 2021-02-25 22:12:17 · 140 阅读 · 0 评论 -
刷题笔记_1 | 贪心算法 | C++ | leetcode605
题目描述假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。解题思路:flowerbed中不存在相邻的两朵花, 从贪心角度考虑,在遵从规则的前提下尽可能的多种花。此处采用连跳两格的方法进行实现。因为如果遇到1,那么下一格子一定是0,这是毋庸置疑的(规则限定),所以如果遇到最后一个格子,或者下个格子不是1,果断填充。C++代码实现class Solution {public: bool canPlaceFlow原创 2021-02-25 21:14:42 · 110 阅读 · 0 评论 -
刷题笔记_1 | 贪心算法 | C++ | leetcode435
1、贪心算法思想采用贪心策略,保证每次操作都是局部最优的从而使最后得到的结果是全局最优的。2、LeetCode435题目描述:(区间问题)给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。解答思路:在选择保留区间时,区间的结尾十分重要。选择区间结尾越小,余留给其他区间的空间就越大,就越能保留更多的区间。因此,我们采取的贪心策略为,优先保留结尾小且不相交的区间。1、按照区间尾部,从小到大进行排序2、遍历排序后的数组,取一个变量记录从左往右遍历的最优结果的当前尾部,如果原创 2021-02-25 00:11:17 · 193 阅读 · 0 评论 -
刷题笔记_1 | 贪心算法 | C++ | leetcode135
1、贪心算法思想采用贪心策略,保证每次操作都是局部最优的从而使最后得到的结果是全局最优的。2、LeetCode 135题目描述(这是一个分配问题):老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。每个孩子至少分配到1个糖果。评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?解答思路:采用贪心策略,进行两边遍历。1、保证每个孩子都有一个糖果;2、从左往右遍历,如果右边的孩子评分比左边的高,则原创 2021-02-24 22:09:54 · 130 阅读 · 0 评论