Leetcode
文章平均质量分 60
agentky
这个作者很懒,什么都没留下…
展开
-
算法合集(图片上不来)
设计模式单例模式它的核心结构只包含一个被称为单例的特殊类。它的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方都需要这样的功能模块,如系统的日志输出,操作系统只能有一个窗口管理器,一台PC连接一个键盘等。核心:全局只有一个实例:static 特性,同时禁止用户自己声明并定义实例(把构造函数设为 private)线程安全(可以通过加锁实现,但用局部静态变量更好)禁止赋值和拷贝用户通过接口获取实例:使用 static 类成员函数避免内存泄漏(可原创 2021-08-16 11:38:01 · 346 阅读 · 0 评论 -
数据结构与算法-TOP-k问题
TOP-k 问题这道题如果要求时间复杂度优先可以考虑快排变形,如果空间复杂度优先,可以使用堆排。下面给出了三种方法,第一种自己实现了一个堆结构,第二种用的stl的优先队列,第三种用了快排模板的变形。堆的解决方法虽然速度不一定有快排快,但对于海量数据,本地不需要存储那么多数据方法1:手写堆class Solution {public: vector<int> smallestK(vector<int>& arr, int k) { .原创 2021-07-27 21:26:07 · 183 阅读 · 0 评论 -
数据结构与算法-归并排序模板记忆
通过递归的方式将大的数组一直分割,直到数组的大小为 1,此时只有一个元素,那么该数组就是有序的了,之后再把两个数组大小为1的合并成一个大小为2的,再把两个大小为2的合并成4的 … 直到全部小的数组合并起来。整体的思想是分治,即先使每个子序列有序,再使子序列段间有序将数组元素拆分成个体,然后两两合并成一组,以此类推递归注意结束条件、递归公式先递归,再合并1.完成数组拆分,直到拆成单个元素2.完成两个分别有序子序列合并得功能函数#include<iostream>using原创 2021-07-27 15:25:06 · 71 阅读 · 0 评论 -
数据结构与算法-快速排序模板记忆
快排的边界问题太容易出错了,所以写一个模板背下来分析:1.选一个哨兵 这里选x = nums[left + right >> 1];这个哨兵最好不要随意改变,要么容易出现边界问题要么容易超时.2.快排的核心是分治 即将一个序列左部分小于等于x 右部分大于等于x3.设置两个指针left right 分别从两端开始,left遇到大于等于x的停下来,right遇到小于等于x的停下来,然后如果i<j 就交换nums[i] nums[j]void quick_sort(int nums[原创 2021-07-27 11:18:10 · 132 阅读 · 0 评论 -
数据结构与算法-堆排序
堆的特点: 完全二叉树+父节点值大于子节点完全二叉树的重要性质: 将完全二叉树的节点按照层序遍历的顺序依次输入到一个数组中,那么任意一个子节点和父节点在数组中的索引有如下数量关系parent=(i-1)/2c1=2i+1//左孩子c2=2i+2//右孩子核心思想:输入一个乱序数组,将他按照层序遍历的顺序逐个填成一个完全二叉树,然后把这棵完全二叉树变成一个大根堆,然后得到当前的最大值,交换到数组的末尾,然后再重复操作,又搞成一个大根堆。再次交换,重复上述过程直到所有元素都排好序。整体步骤分三步.原创 2021-07-27 00:16:12 · 155 阅读 · 0 评论 -
回溯算法模板总结+力扣原题解析
回溯算法复杂度分析回溯本质是遍历所有可能的情况,所以复杂度会比较高,但可以通过剪枝来优化。子集问题:由于每个元素只有选择或者不选两种,所以遍历到每一种情况,时间复杂度为O(2^n),再加上构造的每一组子集都需要放入数组,需要o(n),所以总共O(n * 2^n).空间复杂度,递归深度n,系统栈所用空间O(n);排列问题:时间复杂度O(N!),第一层n个分枝,第二层每个分支又有n-1分支。所以nn-1n-1…*1=n!,空间复杂度O(N)组合问题:组合问题就是一种子集问题(组合一般限制元素个数)回溯原创 2021-07-20 10:29:14 · 768 阅读 · 0 评论 -
平分物品(网易2021校招笔试提前批)(dfs)
题目:现在有n个物品,每一个物品都有一个价值,现在想将这些物品分给两个人,要求这两个人每一个人分到的物品的价值总和相同(个数可以不同,总价值相同即可),剩下的物品就需要扔掉,现在想知道最少需要扔多少价值的物品才能满足要求分给两个人。这道题我认为是选择问题 通过dfs每一种可能的选择,找到所有可能的解法题意转换 将题意转换很重要,题目是求最少丢掉多少物品能够平分给两个人,转换为两个人从0开始拿,计算出所有满足平分条件的最值(最少丢弃)具体步骤首先将题目转换为两个人从0开始拿物品,对原创 2021-07-14 14:32:30 · 1159 阅读 · 0 评论 -
数据结构与算法-- 排序
快速排序核心思想:参考链接https://developer.51cto.com/art/201403/430986.htm/*1.先从数列中取出一个数作为基准数。1.1 直接取第一个元素2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。2.1 两个指针i,j分别指向头尾,相向而行。先移动j,直到j找到一个小于等于基准数的,i找到一个大于基准数的,交换他们。2.2 继续2.2 直到i=j ,交换这个位置和首元素3.再对左右区间重复第二步,直到各区间只有一个原创 2021-04-06 22:14:23 · 118 阅读 · 0 评论 -
数据结构与算法--二分查找
核心思想:一般查找有序序列中的某个元素可以采用二分查找基本公式:mid=1+(R-L)/2求开方69. Sqrt(x) (Easy)题目描述给定一个非负整数,求它的开方,向下取整。输入输出样例输入一个整数,输出一个整数。Input: 8Output: 28 的开方结果是 2:82842:::,向下取整即是 2。核心思想:while结束的条件为L>R,初始L为0,R为a,mid为1+(R-L)/2 ,sqrt为a/mid;若sqrt大于mid,则将L赋值为mid+1,若sqrt小于原创 2021-04-04 14:55:43 · 424 阅读 · 0 评论 -
数据结构算法---双指针
算法核心思想:双指针多用于遍历数组,可以同时遍历一个数组或分别遍历不同的数组。常见的设计思想如下:对于排序后的数组,双指针分别指向数组的头尾,遍历方向相反,用于搜索。双指针指向两个数组,分别遍历快慢指针滑动窗口两数之和167. Two Sum II - Input array is sorted (Easy)题目描述在一个增序的整数数组里找到两个数,使它们的和为给定值。已知有且只有一对解。输入输出样例输入是一个数组(numbers)和一个给定值(target)。输出是两个数的位置,从原创 2021-03-21 20:51:49 · 410 阅读 · 0 评论 -
数据算法---贪心算法
算法核心思想采用贪心的策略,保证每次操作都是局部最优的,最终达到全局最优。分配问题455. Assign Cookies (Easy)题目描述有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃最多一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子可以吃饱。输入输出样例输入两个数组,分别代表孩子的饥饿度和饼干的大小。输出最多有多少孩子可以吃饱的数量。Input: [1,2], [1,2,3]Output: 2思路:在这个样原创 2021-03-15 11:16:19 · 252 阅读 · 0 评论 -
leetcode第26题--删除排序数组中的重复项(c、c++实现)
题目描述:给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组原创 2020-12-20 15:11:35 · 200 阅读 · 0 评论 -
Leetcode第一题--两数之和(两种解法、两种语言实现)
1.题目描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]2.暴力解法(时间复杂度O(n*n))暴力解法没什么好说的,两个for遍历,就是注意他是要两个不同的元素且一个元素不能重复使原创 2020-12-10 17:23:48 · 309 阅读 · 3 评论