当前位置:   article > 正文

每日5题Day4 - LeetCode 16 - 20

每日5题Day4 - LeetCode 16 - 20

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前!

第一题:16. 最接近的三数之和 - 力扣(LeetCode)

  1. class Solution {
  2. public int threeSumClosest(int[] nums, int target) {
  3. //别用dp了,使用双指针省空间一些,
  4. Arrays.sort(nums);
  5. //用变量代替数组长度
  6. int n = nums.length;
  7. //我们找到的和可能大于或者小于target,
  8. //最终返回结果是一个差值,初始化一个最大值吧
  9. int best = Integer.MAX_VALUE;
  10. //注意范围是n - 2,因为三个数之和
  11. for(int i = 0; i < n - 2; i++){
  12. //去重
  13. if(i > 0 && nums[i] == nums[i - 1]){
  14. continue;
  15. }
  16. //规定左右边界
  17. int j = i + 1, k = n - 1;
  18. //判断了
  19. while(j < k){
  20. int cursum = nums[i] + nums[j] + nums[k];
  21. if(cursum == target){
  22. //题目说只有一组满足要求,如果发现最后解可以直接返回了
  23. return target;
  24. }
  25. if(Math.abs(cursum - target) < Math.abs(best - target)){
  26. best = cursum;
  27. }
  28. else if(cursum > target){
  29. k--;
  30. }
  31. else{
  32. j++;
  33. }
  34. }
  35. }
  36. return best;
  37. }
  38. }

第二题:17. 电话号码的字母组合 - 力扣(LeetCode)

  1. class Solution {
  2. public List<String> letterCombinations(String digits) {
  3. //考虑特殊情况
  4. if(digits.equals("")){
  5. return new ArrayList<>();
  6. }
  7. //读题可以发现这个其实相当于一个dfs的题目,回溯一下
  8. char[] words = digits.toCharArray();
  9. //返回最后的结果
  10. List<String> res = new ArrayList<>();
  11. //存储的过程
  12. Deque<Character> path = new ArrayDeque<>();
  13. //因为存在映射
  14. Map<Character, List<Character>> map = new HashMap<>();
  15. map.put('2', Arrays.asList('a', 'b', 'c'));
  16. map.put('3', Arrays.asList('d', 'e', 'f'));
  17. map.put('4', Arrays.asList('g', 'h', 'i'));
  18. map.put('5', Arrays.asList('j', 'k', 'l'));
  19. map.put('6', Arrays.asList('m', 'n', 'o'));
  20. map.put('7', Arrays.asList('p', 'q', 'r', 's'));
  21. map.put('8', Arrays.asList('t', 'u', 'v'));
  22. map.put('9', Arrays.asList('w', 'x', 'y', 'z'));
  23. traversal(0, words, res, path, map);
  24. return res;
  25. }
  26. private static void traversal(int cur_idx, char[] words, List<String> res, Deque<Character> path, Map<Character, List<Character>> map){
  27. //所有数字都遍历了,可以添加结果了
  28. if(cur_idx == words.length){
  29. StringBuilder sb = new StringBuilder();
  30. for(char ch : path){
  31. sb.append(ch);
  32. }
  33. res.add(sb.toString());
  34. return;
  35. }
  36. //每次添加字母进去的过程
  37. for(char ch : map.get(words[cur_idx])){
  38. path.offerLast(ch);
  39. traversal(cur_idx + 1, words, res, path, map);
  40. path.pollLast();
  41. }
  42. }
  43. }

第三题:18. 四数之和 - 力扣(LeetCode)

  1. class Solution {
  2. public List<List<Integer>> fourSum(int[] nums, int target) {
  3. List<List<Integer>> result = new ArrayList<>();
  4. Arrays.sort(nums);
  5. for (int i = 0; i < nums.length - 3; i++) {
  6. if (nums[i] > 0 && nums[i] > target) {
  7. return result;
  8. }
  9. if (i > 0 && nums[i - 1] == nums[i]) { // 对nums[i]去重
  10. continue;
  11. }
  12. for (int j = i + 1; j < nums.length - 2; j++) {
  13. if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重
  14. continue;
  15. }
  16. int left = j + 1;
  17. int right = nums.length - 1;
  18. while (right > left) {
  19. long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
  20. if (sum > target) {
  21. right--;
  22. } else if (sum < target) {
  23. left++;
  24. } else {
  25. result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
  26. while (right > left && nums[right] == nums[right - 1]) right--;
  27. while (right > left && nums[left] == nums[left + 1]) left++;
  28. left++;
  29. right--;
  30. }
  31. }
  32. }
  33. }
  34. return result;
  35. }
  36. }

第四题:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode() {}
  7. * ListNode(int val) { this.val = val; }
  8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12. public ListNode removeNthFromEnd(ListNode head, int n) {
  13. //搞一个头节点
  14. ListNode dummy = new ListNode(-1, head);
  15. ListNode cur = dummy;
  16. //找到要删除的点
  17. while(n > 0){
  18. cur = cur.next;
  19. n--;
  20. }
  21. ListNode pre = dummy;
  22. //从头找到要删除点的前一个点
  23. while(cur.next != null){
  24. pre = pre.next;
  25. cur = cur.next;
  26. }
  27. //跳过要删除的点直接连接
  28. pre.next = pre.next.next;
  29. return dummy.next;
  30. }
  31. }

 第五题:20. 有效的括号 - 力扣(LeetCode)

  1. class Solution {
  2. public boolean isValid(String s) {
  3. //用hashmap来存一下相匹配的括号
  4. Map<Character, Character> map = new HashMap<>();
  5. map.put('}', '{');
  6. map.put(')', '(');
  7. map.put(']', '[');
  8. Deque<Character> deque = new ArrayDeque<>();
  9. //遍历放入,是左括号就放入栈,右括号就弹出看是否匹配
  10. for(char ch : s.toCharArray()){
  11. if(!map.containsKey(ch)){
  12. deque.offerLast(ch);
  13. }
  14. else{
  15. if(map.get(ch) == deque.peekLast()){
  16. deque.pollLast();
  17. }else{
  18. return false;
  19. }
  20. }
  21. }
  22. //记得判断栈是否为空,不然就还有左括号,消除不完
  23. return deque.size() == 0;
  24. }
  25. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/615495
推荐阅读
相关标签
  

闽ICP备14008679号