数组
数组经典题
爱抖腿的嘻嘻嘻
这个作者很懒,什么都没留下…
展开
-
加油站134
有一个环路上有N个加油站gas[i]表示其中第i个加油站的油量,然后cost表示下个i开往i+1个加油站需要耗费的代价。求从哪个加油站出发的时候可以走完全程。简单的思路就是遍历每一个加油站,然后遍历找到下一个能去的地方,因为是一个环形的,所以可以算下标的时候对n取余,因为此时每一个地点都要去,所以如果从0开始到i结束,0到i之间的任何一个地方都无法到i之后,可以直接跳过,所以可以记录一个可到达的最远地方cnt。进入循环之后算出此时的可到达目标j,然后把去下个地方的代价和此地的补充加上,如果发现代价大于原创 2021-04-01 15:40:18 · 107 阅读 · 0 评论 -
下一个排列(下个最小的字典序排列)31
我们需要找到一个大于当前序列的新排列,并且增加幅度要最小对应的措施就是将左边的一个较小值和右边的一个较大值交换,使得字典序变大,而左边这个较小值尽量靠右,右边的较大值尽量小,且完成后需要将较大值右边的数按照升序排列。所以我们对应做法就是三步。第一步,从右遍历找到第一对f(i)<f(i+1)则此时i+1到n的数全都是降序的,第二步,再从右找到最小的大于f(i)的数,将他们交换第三步,把交换过来的较大值右边的序列进行升序排列。这里有个细节是small在第三步直接加1,因为不管是有没有进行第二步,原创 2021-02-02 11:55:28 · 217 阅读 · 0 评论 -
移动0 283
既然要移动所有0,则直接计算所有的非0元素,将其覆盖到之前的位置,最后j的数值就是非0元素的个数,它的位置往后全是0,则直接覆盖即可。class Solution { public void moveZeroes(int[] nums) { int j=0; for(int i=0;i<nums.length;i++){ if(nums[i]!=0){ nums[j++]=nums[i];原创 2021-02-21 09:44:18 · 79 阅读 · 0 评论 -
第一次只出现一个的字符(哈希)
找到第一个在字符串中出现1次的字符最直观的想法就是遍历字符串,每遇到一个字符都遍历后面的字符,看有没有不重复的,这种做法最好是O(n),平均是O(n2),所以并不是最好的。那第二种方法就是统计每个字符在字符串中出现的位置,那要有一个东西来记录就是用空间换时间,比如哈希表。哈希表可以把一个字符映射成一个数字,所以哈希表的key定义为字符,value定义为数字,就可以遍历一遍得到每个字符的出现次数,然后再遍历一遍,出现一次的第一个字符就是第一个。hashmap可以直接拿来用,但这个题可以通过自己实现一个简原创 2020-12-08 14:41:47 · 236 阅读 · 0 评论 -
无序数组中找两个数的和为给定值
求一个无序数组中两个数的下标,他们加起来为给定值首先这个题是无序的,所以不能用两个指针遍历得到,如果排序之后再遍历,那样复杂度是O(nlogn)而且返回的是原来的下标。所以不能这么做。只能利用哈希表来用空间复杂度O(N)来换时间复杂度O(N)利用一个hashmap来存储数组的下标,遍历一次即可。import java.util.HashMap;class Solution { public int[] twoSum(int[] nums, int target) { int原创 2020-12-25 21:45:38 · 358 阅读 · 1 评论