leetcode刷题记录04——top100题里的7道中等题
leetcode刷题记录04——top100题里的7道中等题
上一篇博客:
leetcode刷题记录01——top100题里的7道简单题
leetcode刷题记录02——top100题里的7道简单题
leetcode刷题记录03——top100题里的6道简单+1道中等题
-
最长连续序列
一遍过,先Arrays.sort(nums);排序然后去判断,i-1与i下标的值为1则增加1,如果差值>1则置为0,在每个cnt里取最大值; -
盛最多水的容器
没有太多思路,想到了可能与最大股票价格有点像,但不知道怎么写。
题意是好理解的,看了题解,豁然开朗。双指针太牛了。class Solution {public int maxArea(int[] height) {int l = 0, r = height.length-1;int ans = 0;while(l<r){int area = Math.min(height[l],height[r])*(r-l);ans = Math.max(ans,area);if(height[l]<=height[r]){++l;}else{--r;}}return ans;} }
-
三数之和
自己写了半天有超时,还是老实按照题解的来吧,双指针。
# Arrays 转 List<Integer>
List<Integer> thirdList = Arrays.asList(nums[i],nums[j],third);
# int[] 转 List<Integer>
List<Integer> integerList = Arrays.stream(nums).boxed().collect(Collectors.toList());
# List<Integer> 转 String
integerList.toString(); 或者String thirdString = thirdList.stream().map(String::valueOf).collect(Collectors.joining(","));
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new ArrayList<List<Integer>>();Arrays.sort(nums);for(int i = 0; i< nums.length; i++){if(nums[i]> 0){break;}if(i > 0 && nums[i]==nums[i-1]){continue;}int left = i+1;int right = nums.length-1;int target = -nums[i];while(left < right){int sum = nums[left]+nums[right];if(sum == target){list.add(Arrays.asList(nums[i],nums[left],nums[right]));left++;right--;while(left < right && nums[left]==nums[left-1]){left++;}while(left< right && nums[right]==nums[right+1]){right--;}}else if(sum>target){right--;}else{left++;}}}return list;}
}
- 无重复的最长字串
第一印象想到了set,看了题解才有点明白。mark下
class Solution {public int lengthOfLongestSubstring(String s) {// 哈希集合,记录每个字符是否出现过Set<Character> set = new HashSet<>();int ans = 0;// 右指针,从最左侧开始int rk = -1;for(int i = 0; i< s.length(); i++){if(i != 0){// 左指针向右移动一格,移除一个字符set.remove(s.charAt(i-1));}while(rk+1<s.length() && !set.contains(s.charAt(rk+1))){// 不断的移动右指针set.add(s.charAt(rk+1));rk+=1;}// 第 i 到 rk 个字符是一个极长的无重复字符子串ans = Math.max(ans,rk-i+1);}return ans;}
}
- 找到字符串中的所有字母异位词
一遍过,个人认为比官方(答案有点匪夷所思,实在没看懂)的好理解。
(1)把q先转成charArray,排序后在拼接。
(2)然后在p中遍历每次截取q长度的子串,然后转成charArray排序后在拼接;
(3)与(1)中结果进行比较
class Solution {public List<Integer> findAnagrams(String s, String p) {char[] pChar = p.toCharArray();Arrays.sort(pChar);String pString = new String(pChar);List<Integer> list = new ArrayList<>();for(int i =0; i < s.length()-p.length()+1;i++){char[] subStr = s.substring(i,i+p.length()).toCharArray();Arrays.sort(subStr);if(pString.equals(new String(subStr))){list.add(i);}}return list;}
}
- 和为k的子数组
题目没太看懂,大致是判断里边有多少个连续序列的和为k;
直接抄的答案…
class Solution {public int subarraySum(int[] nums, int k) {int count = 0;for(int start = 0; start < nums.length; start++){int sum = 0;for(int end = start;end>=0;--end){sum+=nums[end];if(sum==k){count++;}}}return count;}
}
- 最大子数组和
直接暴力遍历法;部分用例会超时;
class Solution {public int maxSubArray(int[] nums) {if(nums.length==0){return 0;}else if(nums.length==1){return nums[0];}int ans = Integer.MIN_VALUE;for(int i = 0; i< nums.length; i++){int max = 0;int j = i;while(j < nums.length){max += nums[j];ans = Math.max(ans,max);j+=1;}}return ans;}
}
看了答案后,用动态规划,似乎也比较好理解;
class Solution {public int maxSubArray(int[] nums) {if(nums.length==0){return 0;}else if(nums.length==1){return nums[0];}int pre = 0;int maxAns = nums[0];for(int i = 0; i< nums.length; i++){pre = Math.max(pre+nums[i],nums[i]);maxAns = Math.max(maxAns, pre);}return maxAns;}
}