算法和数据结构
算法和数据结构
山中有木
emm
展开
-
34.在排序数组中查找元素的第一个和最后一个位置
题目描述:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?...原创 2022-01-26 21:49:06 · 842 阅读 · 0 评论 -
31.下一个排列--力扣题解
题目描述:实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。方法一:从数组后面开始遍历,找到第一个不是降序的元素nums[i],再用一个循环,遍历 i 之后的元素,找到比 nums[i] 大的元素 nums[j] ,交换nums[i] 和 nums[j] ,然后再倒序交换 nums[i] 之后的元素即可class原创 2022-01-26 11:44:17 · 337 阅读 · 0 评论 -
15.三数之和--力扣题解
题目描述:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。原创 2022-01-26 10:12:02 · 484 阅读 · 0 评论 -
1688.比赛中的配对次数--力扣题解
题目描述:给你一个整数 n ,表示比赛中的队伍数。比赛遵循一种独特的赛制:如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。如果当前队伍数为 奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,且产生 (n - 1) / 2 + 1 支队伍进入下一轮。返回在比赛中进行的配对次数,直到决出获胜队伍为止。方法一:把n分奇偶讨论public int numberOfMatch原创 2022-01-25 11:42:29 · 75 阅读 · 0 评论 -
11.盛最多水的容器--力扣题解
题目描述:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。方法一:暴力法,两个for循环,但是这种方法会超时class Solution { public int maxArea(int[] height) { int max=0;原创 2022-01-24 13:49:59 · 352 阅读 · 0 评论 -
53.最大子数组和--力扣题解
题目描述:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。方法一:动态规划我想到的第一个思路是动态规划这个方向,一开始想到的是maxSub = Math.max(f(n-1)+x,f(n-1)),但是这样的话,需要每次重新设定起始点,看了题解后,发现可以改成下面形式,核心的这一行是preMax=Math.max(preMax+nums[i],nums[i]);,意思是,如果前面累加的结果还不如num[i]原创 2022-01-24 12:22:28 · 57 阅读 · 0 评论 -
169.多数元素--力扣题解
题目描述:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。方法一:先排序。由于多数元素的出现次数>⌊ n/2 ⌋,所以排完序之后,数组中间的元素必定是多数元素此处我使用了堆排序 class Solution { public int majorityElement(int[] nums) { heapSort(nums); return原创 2022-01-24 10:12:42 · 100 阅读 · 0 评论 -
448.找到所有数组中消失的数字--力扣题解
题目描述:给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。方法一:这是我想到的第一个思路先排序,再遍历数组,由于元素区间为[1,n],排序后,遍历数组可以找到在区间[1,n]内,数组不存在的元素,此处排序使用了快排算法class Solution { public List<Integer> findDisappearedNumbers(in原创 2022-01-23 17:58:58 · 125 阅读 · 1 评论 -
283. 移动零--力扣题解
题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序方法一:思路:先遍历一次数组,计算数组中0的个数再次遍历数组,把非零元素放到前面,然后把数组后面的元素用0填充class Solution { public void moveZeroes(int[] nums) { int count = 0; for (int i=0;i< nums.length;i++){ i原创 2022-01-23 16:29:26 · 378 阅读 · 0 评论 -
136.只出现一次的数字--力扣题解
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?方法一:先排序,再遍历排序后的数组,即可找出只出现了一次的元素但是这是方法的时间复杂度无法达到线性方法二:由于要求要达到线性的时间复杂度,而且不能使用额外的空间,可以考虑位运算异或运算:交换律:a ^ b ^ c <=> a ^ c ^ b任何数于0异或为任何数 0 ^ n =>原创 2022-01-23 15:47:12 · 50 阅读 · 0 评论 -
121买卖股票的最好时机--力扣题解
题目描述:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。方法一:暴力法这是我想到的第一个思路使用两个for循环,遍历数组的每一个元素,对于元素 i ,再依次遍历该元素后面的每一个元素,找出最大差值class Solution { pub原创 2022-01-22 23:06:10 · 674 阅读 · 0 评论 -
1030. 距离顺序排列矩阵单元格--力扣题解
题目描述:方法一:我的思路:画图可知,需要输出的二维数组的顺序如下:(1,2,3为输出的顺序)主要是要分析边界问题class Solution { public int[][] allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) { int[][] result = new int[rows*cols][]; result[0] =new int[] {rCenter,cCent原创 2022-01-17 23:40:45 · 273 阅读 · 0 评论 -
面试题 10.01. 合并排序的数组--力扣题解
题目描述:方法一:我的思路:先判断是升序还是降序假如是升序:利用两个指针a和b,分别指向数组A和数组B,从数组A的后端开始插入元素,指针a和b分别逐个遍历数组A和数组B,把较大的元素插入到数组A的后端class Solution { public void merge(int[] A, int m, int[] B, int n) { if (m==0){ for (int i=0;i<n;i++){ A[原创 2022-01-17 23:31:43 · 80 阅读 · 0 评论 -
1160. 拼写单词--力扣题解
题目描述:给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。返回词汇表 words 中你掌握的所有单词的 长度之和。方法一:我的思路:把words中的每一个字符串拿出来,转换成字符数组,查看每一个字符是否存在于chars中,如果存在,则在chars中原创 2022-01-17 23:21:53 · 145 阅读 · 0 评论 -
27. 移除元素--力扣题解
题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。方法一:我的思路:由于需要原地修改数组,并且数组的顺序可以改变返回值为count,也就是该数组移除掉特定元素 val 的长度遍历数组,当元素 nums[i] == val 时,把数组后面的元素移到 nums[i] 的位置,并且原创 2022-01-17 23:11:42 · 76 阅读 · 0 评论 -
剑指offer22.链表中倒数第k个节点--力扣题解
题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。方法一,设置两个指针设置两个指针p1,p2,让p1先走 k-1 步,然后p1和p2同时往后移动,当p1到达了最后一个节点,此时,p2所在节点,就是倒数第k个节点public ListNode getKthFromEnd(ListNode hea原创 2021-10-30 11:05:58 · 87 阅读 · 0 评论 -
26删除有序数组中的重复项--力扣题解
题目给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。分析当数组nums为空(长度为0)时,直接返回0length是要返回的值,即新数组的长度,也就是不含重复元素的范围的长度因为nums数组的第一个元素,一定不重复,因此可以从nums[1]开始遍历数组当元素 i 和元素 i-1 相同时,说明元素重复,此时不作操作,继续遍历当元素i原创 2021-10-29 23:46:32 · 57 阅读 · 0 评论 -
有效的括号--力扣题解
题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。...原创 2021-10-29 22:53:42 · 69 阅读 · 0 评论 -
最小栈的实现
《小灰的算法之旅》学习笔记题目:实现一个栈,该栈带有出栈(pop),入栈(push),取最小元素(getMin)3个方法,要保证这3个方法的事件复杂度都是O(1)解决方法:设原有的栈为A,新建一个辅助栈B当第1个元素进入栈A时,让新元素也进入栈B,此时,这个唯一的元素就是栈A的最小值之后,当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素也进入栈B每当栈A有元素出栈时,若出栈元素是栈A当前最小值,则让栈B的栈顶元素出栈,此时,栈B余下的栈顶元素所指向的,原创 2021-10-27 11:11:44 · 96 阅读 · 0 评论 -
两数之和--力扣题解
题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。方法一,枚举用两个for循环,遍历数组的每一个元素,对于元素i,遍历元素i之后的元素,看是否存在target-i元素,如果存在,则输出分析这是我想到的第一种方法,用到了两个for循环,如果数组有n个元素,其时间复杂度为O(n2),空间复杂原创 2021-10-29 15:46:26 · 60 阅读 · 0 评论 -
判断一个数是否为2的整数次幂
《小灰的算法之旅》学习笔记题目判断一个正整数是否为2的整数次幂,如果是,则返回true,否则,返回false方法一:穷举法步骤创建一个中间变量temp,初始值为1,然后进入一个循环,每次循环都让temp乘以2,并和该整数相比较如果不相等,则让temp*2;如果temp>目标整数,则说明目标整数不是2的整数次幂;如果相等,则说明目标整数是2的整数次幂分析如果目标整数的大小为n,则此方法的时间复杂度为O(logn)public boolean exhaustively(int num原创 2021-10-28 19:46:53 · 2555 阅读 · 0 评论 -
判断整数奇偶性
一:模2求余public void judgeParity(int num){ if (num%2==0) System.out.println("偶数"); else System.out.println("奇数"); }二:移位运算public void judgeParity(int num){ if ((num & 1)==0) System.out.pri原创 2021-10-28 08:00:00 · 232 阅读 · 0 评论 -
求最大公约数
文章目录题目:一 :辗转相除法二: 更相减损术三:在更相减损术的基础上使用移位运算《小灰的算法之旅》学习笔记题目:求两个整数的最大公约数解决方法一 :辗转相除法定理:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数步骤:根据以上定理,不断把两个较大的整数之间的运算,简化成两个较小整数之间的运算,直到两个数可以整除,或其中一个数减小到1为止分析:当两个整数较大时,a%b取模运算的性能会比较差,时间复杂度可近似为O(log(max(a,b)))举原创 2021-10-27 14:34:02 · 73 阅读 · 0 评论