leetcode热题100——第一天:1、2、3、4

目录

    • 0.总说
    • 1. 1.两数之和
      • 1.题目描述
      • 2. 题目解析
    • 2. 2.两数相加
      • 1.题目描述
      • 2.题目解析
    • 3. 3.无重复字符的最长子串
      • 1.题目描述
      • 2.题目解析
    • 4. 4.寻找两个正序数组的中位数
      • 1.题目描述
      • 2. 题目解析

0.总说

荒废了那么久的学业,该拾起来啦,今天是2022-05-18,至少每天刷两道题。前几道写了好几遍了,直接简写了。

1. 1.两数之和

1.题目描述

leetcode热题100——第一天:1、2、3、4_第1张图片

2. 题目解析

遍历,寻找有映射关系的两数,所以,直接使用Map哈希表即可。注意:HashMap的第一个参数是key,第二个是value

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> res=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int tmp=target-nums[i];
            if(res.containsKey(tmp)){
                int []ans =new int[2];
                ans[0]=res.get(tmp);
                ans[1]=i;
                return ans;
            }
            else{
                res.put(nums[i],i);
            }
        }
        return new int[0];
    }
}

2. 2.两数相加

1.题目描述

leetcode热题100——第一天:1、2、3、4_第2张图片

2.题目解析

链表计算加法,考虑进位问题与指针变换问题。
进位:用一个int 变量存储,用加和值整除10的结果更新该值,最后注意遍历完可能还有一个值。
指针变换问题:每次加法完要对两个加数的指针后移;使用一个废的头指针(new的值无意义)记录头指针的位置,然后用一个指针指向下,就可以用这个指针进入循环体;两个加数是否到头问题:用三元表达式判断,如果为空则该加数为0,否则为该链表的值,注意更新指针位置进行非空判断。

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head=new ListNode(0);
        ListNode cur=head;
        int jin=0;
        while(l1!=null||l2!=null){
            int a1=(l1==null)?0:l1.val;
            int a2=(l2==null)?0:l2.val;
            int a=a1+a2+jin;
            cur.next=new ListNode(a%10);           
            cur=cur.next;
            jin=a/10;
            if(l1!=null)
                l1=l1.next;
            if(l2!=null)
            l2=l2.next;
        }
        if(jin!=0){
            cur.next=new ListNode(jin);
        }
        return head.next;
    }
}

3. 3.无重复字符的最长子串

1.题目描述

leetcode热题100——第一天:1、2、3、4_第3张图片

2.题目解析

判断是否重复可以想到映射表或者集合,这里由于需要记录长度(或者说长度)所以选择映射表Map。

记录长度:由于子串是连续的,所以记录起始位置就可以记录到长度,所以维护一个left记录起点,维护一个max记录过程中的最大值。由于无法将前面的字符从map中去除,所以判断该字符的位置与left的关系即可。

注意:长度计算方法;空字符串。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length()==0)return 0;
        Map<Character,Integer> res=new HashMap<>();
        int left=0;
        int max=0;
        for(int i=0;i<s.length();i++){
            if(res.containsKey(s.charAt(i))){
                int tmp=res.get(s.charAt(i))+1;
                max=max>(i-left)?max:(i-left);
                left=tmp>left?tmp:left;               
            }
            res.put(s.charAt(i),i);
            max=max>(i-left+1)?max:(i-left+1);
        }
        return max;
    }
}

4. 4.寻找两个正序数组的中位数

1.题目描述

leetcode热题100——第一天:1、2、3、4_第4张图片

2. 题目解析

时间复杂度要求log+正序数组:使用二分查找进行查询。

奇数与偶数的中位数计算:偶数的中位数是两个数的平均,所以可以统一计算:求第(长度+1除以2)和(长度+2除以2)大的两个数的平均值

代码是题解中的,我用自己的思路梳理:

转换成求第k小的数字,两个数组A、B比较第k/2个数字,如果A小,则A的前面k/2个数字都不是,所以去掉该部分,求新的A与B,第(k-k/2)小的数字,直至k=1或者一个数组为空。
如果数组的长度小于k/2,则直接指向末尾即可。

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    int n = nums1.length;
    int m = nums2.length;
    int left = (n + m + 1) / 2;
    int right = (n + m + 2) / 2;
    //将偶数和奇数的情况合并,如果是奇数,会求两次同样的 k 。
    return (getKth(nums1, 0, n - 1, nums2, 0, m - 1, left) + getKth(nums1, 0, n - 1, nums2, 0, m - 1, right)) * 0.5;  //注意是*0.5不是除以2
}
    
    private int getKth(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k) {
        int len1 = end1 - start1 + 1;
        int len2 = end2 - start2 + 1;
        //让 len1 的长度小于 len2,这样就能保证如果有数组空了,一定是 len1 
        if (len1 > len2) return getKth(nums2, start2, end2, nums1, start1, end1, k);
        if (len1 == 0) return nums2[start2 + k - 1];

        if (k == 1) return Math.min(nums1[start1], nums2[start2]);

        int i = start1 + Math.min(len1, k / 2) - 1;
        int j = start2 + Math.min(len2, k / 2) - 1;

        if (nums1[i] > nums2[j]) {
            return getKth(nums1, start1, end1, nums2, j + 1, end2, k - (j - start2 + 1));
        }
        else {
            return getKth(nums1, i + 1, end1, nums2, start2, end2, k - (i - start1 + 1));
        }
    }
}
作者:windliang
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(力扣题目练习,leetcode,算法,职场和发展)