3.无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
思路:滑动窗口
- 定义一个map来存字符串的值和下标
- 用左右指针制造滑动窗口,右指针不断往右移,没有重复的字符就存到map,如果遇到重复的字符,就把左指针移到前面的重复字符的下一位(相当于把前面的重复字符删除)
- 移动指针过程中,记录窗口长度的最大值即为答案。
var lengthOfLongestSubstring = function(s) {let left = 0; //定义左指针let maxLength = 0; //窗口最大长度const map = new Map(); //map 存放字符串的值和下标for(let right = 0; right < s.length; right++){//如果出现了重复字符,则把指针移到重复字符的下一位//因为每个字符都会存到map里,所以需要判断下标是否在左指针右边(就是滑动窗口里面)if(map.has(s[right]) && map.get(s[right]) >= left){left = map.get(s[right]) + 1;}map.set(s[right], right) //把字符存进mapmaxLength = Math.max(maxLength, right-left + 1) //计算最大长度}return maxLength;};
215.数组中的第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
思路:考察排序,快排、堆排等
快排方案:
堆排方案var findKthLargest = function(nums, k) {const arr = quickSort(nums);return arr[k-1];};let quickSort = (arr) => {if(arr.length <= 1){return arr}let pivotIndex = Math.floor(arr.length / 2)//向下取整找中间数为基准let pivot = arr.splice(pivotIndex,1)[0];//把基准单独抽出来let left = []let right = []for(let i = 0; i < arr.length; i++){if(arr[i] > pivot){left.push(arr[i])}else{right.push(arr[i])}}return quickSort(left).concat([pivot],quickSort(right))//将左边的数组、基准、右边的数组拼起来}
