LeetCode-hot100题解—Day1

慈云数据 2024-03-15 技术支持 69 0

原题链接:力扣热题-HOT100

题解的顺序和题目的顺序一致,那么接下来就开始刷题之旅吧

力扣hot100题解 1-8

    • 1.两数之和
    • 2.两数相加
    • 3.无重复字符的最长子串
    • 4.寻找两个正序数组的中位数
    • 5.最长回文子串
    • 6.Z字形变换
    • 7.整数反转
    • 8.字符串转换整数(atoi)

      1.两数之和

      思路1:暴力枚举法

      暴力枚举法很简单,遍历nums数组的每一个元素,找到和target-nums[i]相同的元素即可。

      时间复杂度:需要使用到两层for循环,所以时间复杂度为O(n^2)。

      代码实现:

      class Solution {
          public int[] twoSum(int[] nums, int target) {
              for(int i=0;i
                 for(int j=i+1;j
                     if(nums[j]==target-nums[i]){
                         return new int[] {i,j};
                     }   
                 } 
              }
              return null;
          }
      }
      
          public int[] twoSum(int[] nums, int target) {
              Map
                  int tar = target-nums[i];
                  if(tab.containsKey(tar)){
                      return new int[] {i,tab.get(tar)};
                  }else{
                      tab.put(nums[i],i);
                  }
              }
               return null;
          }
      }
      
          public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
              ListNode head = new ListNode(-1);
              ListNode tail = head;
              int sum;
              int carry = 0;
              while(l1 != null || l2 != null){
                  int n = l1 == null ? 0 : l1.val;
                  int m = l2 == null ? 0 : l2.val;
                  sum = n + m + carry;
                  carry = sum / 10;
                  tail.next = new ListNode(sum % 10);
                  tail = tail.next;
                  l1 = l1 != null ? l1.next : null;
                  l2 = l2 != null ? l2.next : null;
              }
              if(carry != 0){
                  tail.next = new ListNode(carry);
              }
              return head.next;
          }
      };
      
          public int lengthOfLongestSubstring(String s) {
              HashMap
                  return 0;
              }
              int max=0;
              int left=0;
              for(int i = 0;i
                  if(map.containsKey(s.charAt(i))){
                      left = Math.max(left,map.get(s.charAt(i))+1);
                  }
                  map.put(s.charAt(i),i);
                  max=Math.max(max,i-left+1);
              }
              return max;
          }
      }
      
          public double findMedianSortedArrays(int[] nums1, int[] nums2) {
              //将nums1设置为长度较小的数组,方便代码的编写
              if(nums1.lengthnums2.length){
                  int[] temp = nums1;
                  nums1 = nums2;
                  nums2 = temp;
              }
              
              int m = nums1.length;
              int n = nums2.length;
              //计算分割线左边元素的数量
              int totalleft = (m+n+1)/2;
              
              //二分法查找nums1部分的分割线
              int left = 0;
              int right = m;
              while(left
                  //这是对于(left+right)/2的特殊处理方式,防止发生整型溢出
                  //同时使用二分法时,如果出现left=i,则这里需要+1,否则不需要
                  int i = left+(right-left+1)/2;
                  int j = totalleft - i;
                  if(nums1[i-1]  nums2[j]){
                      right = i - 1;
                  }else{
                      left = i;
                  }
              }
              int i = left;
              int j = totalleft - i;
              //最后得到两个数组分割线左右两边元素的最大值的最小值
              //为了防止出现分割线左右两边没有元素的极端情况加上判断
              int nums1LeftMax = i ==0 ? Integer.MIN_VALUE : nums1[i-1];
              int nums1RightMin = i ==m ? Integer.MAX_VALUE : nums1[i];
              int nums2LeftMax = j == 0 ? Integer.MIN_VALUE : nums2[j-1];
              int nums2RightMin = j == n ? Integer.MAX_VALUE : nums2[j];
              //计算中位数的值
              if(((m+n) % 2) == 1){
                  return Math.max(nums1LeftMax,nums2LeftMax);
              }else{
                  return (double) ((Math.max(nums1LeftMax,nums2LeftMax) + Math.min(nums1RightMin,nums2RightMin))) / 2;
              }
          }
      }
      
      	while(left
      		if(charArry[left] != charArry[right]){
      			return false;
      		}
      		left++;
      		right--;
      	}
      	return true;
      }
      
          public String longestPalindrome(String s) {
              int len = s.length();
              if(len
                  return s;
              }
              int maxLen = 1;
              int begin = 0;
              //初始化二维数组
              boolean[][] dp = new boolean[len][len];
              for(int i=0;i
                  dp[i][i] = true;
              }
              char[] charArray = s.toCharArray();
              for(int j=1;j
                  for(int i=0;i
                      if(charArray[i] != charArray[j]){
                          dp[i][j]=false;
                      }else{
                          if(j-i
                              dp[i][j]=true;
                          }else{
                              dp[i][j] = dp[i+1][j-1];
                          }
                      }
                      if(dp[i][j] && j-i+1  maxLen){
                          maxLen = j-i+1;
                          begin = i;
                      }
                  }
              }
              return s.substring(begin,begin+maxLen);
          }
      }
      
          public String convert(String s, int numRows) {
              if (numRows == 1) {
                  return s;
              }
              ArrayList
                  rows.add("");
              }
              boolean down = false;
              for (int i = 0, row = 0; i 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon