当前位置:   article > 正文

每日5题Day1 - LeetCode 1-5

每日5题Day1 - LeetCode 1-5

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

第一题:1. 两数之和 - 力扣(LeetCode)

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. //返回值为Int[]数组,所以先初始化,求两数之和,使用空间换时间,用一个HashMap来存储
  4. int[] res = new int[2];
  5. Map<Integer, Integer> map = new HashMap<>();
  6. //对于每一个数都进行遍历,因为不知道到底哪个数是第一个数
  7. for(int i = 0; i < nums.length; i++){
  8. //每次计算一个差值
  9. int dif = target - nums[i];
  10. //key值找到了,取到的value,就是第一个数
  11. if(map.containsKey(dif)){
  12. //找到了,记录一下,不用在意先后顺序
  13. res[0] = map.get(dif);
  14. res[1] = i;
  15. //因为只有一组正确答案,所以有正确答案了就break
  16. break;
  17. }
  18. map.put(nums[i], i);
  19. }
  20. return res;
  21. }
  22. }

第二题:2. 两数相加 - 力扣(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 addTwoNumbers(ListNode l1, ListNode l2) {
  13. //讨论特殊情况,如果某一条是null,则直接返回另外一条
  14. if(l1 == null){
  15. return l2;
  16. }
  17. if(l2 == null){
  18. return l1;
  19. }
  20. //初始化一个头节点,注意要mod10
  21. ListNode node = new ListNode((l1.val + l2.val) % 10);
  22. //设置初始的进位位
  23. int carry = (l1.val + l2.val > 9) ? 1 : 0;
  24. //当前俩节点的值用过了,指向下一位
  25. l1 = l1.next;
  26. l2 = l2.next;
  27. //在正式开始前,首先创造一个dummy节点用于指向虚拟节点,这样返回的时候就直接返回dummy.next
  28. ListNode dummyhead = new ListNode(-1, node);
  29. //注意判断条件:只有进位位及两个链表都遍历完了才能结束
  30. while(l1 != null || l2 != null || carry != 0){
  31. //直接使用进位位carry来初始化当前的值,因为要么是0,要么是1
  32. int sum = carry;
  33. if(l1 != null){
  34. sum += l1.val;
  35. l1 = l1.next;
  36. }
  37. if(l2 != null){
  38. sum += l2.val;
  39. l2 = l2.next;
  40. }
  41. carry = sum / 10;
  42. //创建的节点与之前的节点相连
  43. node.next = new ListNode(sum > 9 ? sum % 10 : sum);
  44. //指向当前节点
  45. node = node.next;
  46. }
  47. return dummyhead.next;
  48. }
  49. }

第三题:3. 两数相加 - 力扣(LeetCode)

  1. class Solution {
  2. public int lengthOfLongestSubstring(String s) {
  3. //如果长度为0或者1,直接返回自身长度就OK
  4. if(s.length() < 2){
  5. return s.length();
  6. }
  7. //便于方便,转为字符数组
  8. char[] words = s.toCharArray();
  9. //用数组来存一个字符的频率不方便,使用map来存最晚出现的下标
  10. Map<Character, Integer> map = new HashMap<>();
  11. //res是最长的长度,l是我们的左边区间
  12. int res = 0, l = 0;
  13. //对于每一个字符进行遍历
  14. for(int r = 0; r < words.length; r++){
  15. //当key值存在的时候,意味着有重复字符了,所以进行左边界的更新
  16. if(map.containsKey(words[r])){
  17. l = Math.max(l, map.get(words[r]) + 1);
  18. }
  19. //注意map的特性,如果对于已经存在的key进行put,会覆盖掉原来的值
  20. map.put(words[r], r);
  21. //每次都更新一下最大值
  22. res = Math.max(res, (r - l) + 1);
  23. }
  24. return res;
  25. }
  26. }

第四题:4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

  1. public class Solution {
  2. public double findMedianSortedArrays(int[] nums1, int[] nums2) {
  3. //看到log的要求和有序,一定要想到二分,对于搜索,一个长度为n的有序数组可以看作一个BST,对于任意数的搜索,最大时间就是树高log(n)
  4. int m = nums1.length;
  5. int n = nums2.length;
  6. // 确保 nums1 是较短的数组
  7. if (m > n) {
  8. return findMedianSortedArrays(nums2, nums1);
  9. }
  10. int left = 0;
  11. int right = m;
  12. int partitionX, partitionY;
  13. while (left <= right) {
  14. // 在 nums1 上进行二分查找
  15. partitionX = (left + right) / 2;
  16. partitionY = (m + n + 1) / 2 - partitionX;
  17. // 计算划分两部分的最大值和最小值
  18. int maxX = (partitionX == 0) ? Integer.MIN_VALUE : nums1[partitionX - 1];
  19. int minX = (partitionX == m) ? Integer.MAX_VALUE : nums1[partitionX];
  20. int maxY = (partitionY == 0) ? Integer.MIN_VALUE : nums2[partitionY - 1];
  21. int minY = (partitionY == n) ? Integer.MAX_VALUE : nums2[partitionY];
  22. // 分类讨论
  23. // 判断是否满足条件
  24. if (maxX <= minY && maxY <= minX) {
  25. // 如果总元素数量为偶数,则取两个最大值和最小值的平均值
  26. if ((m + n) % 2 == 0) {
  27. return (double) (Math.max(maxX, maxY) + Math.min(minX, minY)) / 2;
  28. } else {
  29. // 如果总元素数量为奇数,则取较大的最大值
  30. return (double) Math.max(maxX, maxY);
  31. }
  32. } else if (maxX > minY) {
  33. // 如果 maxX 大于 minY,说明划分位置过大,向左移动
  34. right = partitionX - 1;
  35. } else {
  36. // 如果 maxX 小于等于 minY,说明划分位置过小,向右移动
  37. left = partitionX + 1;
  38. }
  39. }
  40. throw new IllegalArgumentException("Input arrays are not sorted.");
  41. }
  42. }

 第五题:5. 最长回文子串 - 力扣(LeetCode)

  1. class Solution {
  2. public String longestPalindrome(String s) {
  3. //不使用dp了,直接使用中心扩散法,这样在遍历的过程可以直接降为一维的
  4. if (s == null || s.length() < 1) {
  5. return "";
  6. }
  7. int start = 0, end = 0; // 用于记录最长回文子串的起始和结束索引
  8. // 遍历每个字符,以该字符为中心向两边扩展,分别处理单个字符和两个字符为中心的情况
  9. for (int i = 0; i < s.length(); i++) {
  10. int len1 = expandAroundCenter(s, i, i); // 以当前字符为中心的回文串长度
  11. int len2 = expandAroundCenter(s, i, i + 1); // 以当前字符和下一个字符为中心的回文串长度
  12. int len = Math.max(len1, len2); // 取两种情况下的最长回文串长度
  13. // 如果当前回文串长度大于之前记录的最长回文串长度,则更新起始和结束索引
  14. if (len > end - start) {
  15. start = i - (len - 1) / 2; // 计算起始索引
  16. end = i + len / 2; // 计算结束索引
  17. }
  18. }
  19. return s.substring(start, end + 1); // 返回最长回文子串
  20. }
  21. // 辅助方法:以left和right为中心向两边扩展,寻找最长回文串的长度
  22. private int expandAroundCenter(String s, int left, int right) {
  23. // 当左右指针合法且字符相等时,向两边扩展
  24. while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
  25. left--; // 向左扩展
  26. right++; // 向右扩展
  27. }
  28. // 返回当前找到的回文串的长度
  29. return right - left - 1;
  30. }
  31. }

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

闽ICP备14008679号