刷题记录|目标101题--排序算法
作者:Hathaway_Z
写在前面
开个贴记录一下 刷题的过程,目前参照 leetcode101,目标101题,由于太久没写java了,也会涉及到一些java的基础用法,希望能和大家共勉吧~
已刷链接:
- 贪心算法:https://www.nowcoder.com/discuss/1051877
- 双指针:https://www.nowcoder.com/discuss/1057237
- 二分查找:https://www.nowcoder.com/discuss/1059986
排序算法
快速排序
取一个值m,两个指针l与r。
- 先从后向前遍历,如果nums[r]<nums[m],则将nums[m] = nums[r],此时r的位置空出,
- 再从前向后遍历,如果nums[l]>nums[r],则将nums[r] = nums[l],此时l的位置空出
- 直至遍历完以后将nums[m]放在最后一个空位,递归左右两边
时间复杂度 & 空间复杂度:
参考链接:https://www.runoob.com/w3cnote/quick-sort.html
并归排序
将一个数组假定为两个,且都已排序过,左右对比插入新的数组
参考链接:https://www.runoob.com/data-structures/merge-sort.html
插入排序
假定前n-1个已经排序好了,把第n个插入到合适的位置
时间复杂度:O(n2) 空间复杂度:O(1)
参考链接:https://www.runoob.com/data-structures/insertion-sort.html
冒泡排序
每次左右对比,把小的放前面,这样最大的就会放到最后
时间负责度:O(n2) 空间复杂度:O(1)
选择排序
十大排序参考:
https://www.runoob.com/w3cnote/ten-sorting-algorithm.html
No. 1 Kth Largest Element in an Array
题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/
解题思路:
快排的一种变形==》快速选择
class Solution { public int findKthLargest(int[] nums, int k) { int l = 0, r = nums.length - 1; if (l == r) return nums[l]; int target = nums.length - k; while (l <= r) { int mid = quickSelection(nums,l,r); if (mid == target) { return nums[mid]; } else if (mid > target) { r = mid - 1; } else { l = mid + 1; } } return nums[l]; } private int quickSelection(int[] nums,int l, int r) { if (l == r) return l; int mid = nums[l]; while (l < r) { while (r > l && nums[r] >= mid) { r--; } nums[l] = nums[r]; while (l < r && nums[l] <= mid) { l++; } nums[r] = nums[l]; } nums[l] = mid; return l; } }
No. 2 Top K Frequent Elements
题目链接:
https://leetcode.com/problems/top-k-frequent-elements/
解题思路:
先讲每个数字出现的频率用map记录,key为数字,value为频率,然后将这个map按照频率去排序,排序后从后向前取k个。
这里的map排序使用桶排序,创建一个List<Integer>[] bucket的数组,bucket的下标为频率,将相同频率的放入同一个桶。
class Solution { public int[] topKFrequent(int[] nums, int k) { if (nums.length == 1) return nums; Map<Integer,Integer> frequencyMap = new HashMap<Integer,Integer>(); for (int num : nums) { frequencyMap.put(num,frequencyMap.getOrDefault(num,0) + 1); } List<Integer>[] bucket = new List[nums.length + 1]; for (int key : frequencyMap.keySet()) { int value = frequencyMap.get(key); if (bucket[value] == null) { bucket[value] = new ArrayList<>(); } bucket[value].add(key); } ArrayList<Integer> result = new ArrayList<>(); for (int i = bucket.length - 1; i > 0 && result.size() < k;i --) { if (bucket[i] != null) { result.addAll(bucket[i]); } } return result.stream().mapToInt(i->i).toArray(); } }
No.3 Sort Characters By Frequency
题目链接:
https://leetcode.com/problems/sort-characters-by-frequency/
解题思路:
本题与上面一题思路类似,先用map存储字符出现的次数,然后按照次数进行桶排序,最后输出
参考java知识:stringBuilder可以用来改变字符串 https://www.runoob.com/java/java-stringbuffer.html
class Solution { public String frequencySort(String s) { Map<Character,Integer> frequency = new HashMap<Character,Integer>(); for (Character c : s.toCharArray()) { frequency.put(c,frequency.getOrDefault(c,0) + 1); } List<Character>[] bucket = new List[s.length() + 1]; for(Character c : frequency.keySet()) { int value = frequency.get(c); if (bucket[value] == null) { bucket[value] = new ArrayList<Character>(); } bucket[value].add(c); } char[] result = new char[s.length()]; for(int i = bucket.length - 1,j = 0; i > 0; i--){ if (bucket[i] != null) { Character[] chars = bucket[i].toArray(new Character[0]); for (int q = 0; q < chars.length; q ++){ int fre = i; while (fre-- > 0) { result[j++] = chars[q]; } } } } String out = new String(result); return out; } }
No.4 Sort Colors
题目链接:https://leetcode.com/problems/sort-colors/
解题思路:
如果要在一次遍历和常数的内存中完成,需要用指针存储,分为存储0的指针,存储1的指针和存储2的指针。
遍历的时候:
- 设置代表0的指针a0在最前,代表2的指针a2在最后,代表遍历的指针i
- 如果i!=a0和a2 的时候,是有可能进行交换操作的
- 如果nums[i]== 0,和代表0的指针交换,
- 如果nums[i]==1,则直接走到下一步
- 如果nums[i]==2,则和最后面代表2的指针a2交换
- 等于是前面的0数组从前向后在扩张,后面的2数组从后向前在扩张,中间剩的都就会是1.
class Solution { public void sortColors(int[] nums) { int i = 0, k = nums.length - 1; for(int j = 0; j <= k; j++) { if (nums[j] == 0 && i != j) { int temp = nums[j]; nums[j] = nums[i]; nums[i] = temp; i++; j--; } else if (nums[j] == 2 && j != k) { int temp = nums[j]; nums[j] = nums[k]; nums[k] = temp; k--; j--; } } } }#找呀找呀找工作#