LeetCode刷题事件记录(Java)

前言

许多年了,果然我还是不喜欢写文章这类活动,包括写博客在内,虽然也并不是无事可写,但丰 是丰富的感性使得我有太多的灵光一闪,想细细写下却又因为斟字酌句而失了原本的味道,因此不如弃笔不 写。不过年岁渐长,所思所想又与先时不同,故此,准备开启我的博客之旅,记录下成长的点点滴滴, 不仅加深印象也锻炼文笔,更重要的是想要改掉拖延症,养成良好的习惯,慢慢提升自己的技术水平。
那么,前言以毕,话不多说,下面就是我为锻炼Java语言编程水平上LeetCode上的刷题之旅。希望可以坚持更新下去,嗯,加油ヾ(◍°∇°◍)ノ゙!
LeetCode刷题网站:https://leetcode-cn.com/problems/two-sum

题目一:两数之和(简单)

题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例
给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

我的解法

class Solution {
   public int[] twoSum(int[] nums, int target) {
       int[] two={0,0};
       for(int i=0;i<nums.length;i++){
           for(int j=i+1;j<nums.length;j++){
               if(nums[i]+nums[j]==target)
               {
                   two[0]=i;
                   two[1]=j;
               }  
           }
       }
       return two;
   }
}

暴力解法简单直观,时间复杂度是O(n^2),除此之外,官方还给出了使用哈希表的解法,时间复杂度可以降到O(n),有兴趣的同学可以去看看,这里我就先不展开讨论了。

题目二:两数相加(中等)

题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
我的解法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
       int cin=0,v=0;//cin表示进位,v为对应位的两数之和数值
        ListNode a=l1,b=l2,sum=new ListNode(0);//sum用来存放两数之和结点
        ListNode c=sum;//c用来计算并记录两数之和链表的每一个结点
        while(a!=null||b!=null){
            if(a==null){//若链表a为空,该两数之和结点的值为链表b结点的值加上进位值cin;b指向下一结点
                v=b.val+cin;
                b=b.next;
            }
            else if(b==null){//若链表b为空,该两数之和结点的值为链表a结点的值加上进位值cin;a指向下一结点
                v=a.val+cin;
                a=a.next;
            }
            else {//若链表a、b都非空,该两数之和结点的值为链表a结点的值+链表b结点的值+进位值cin;a和b指向下一结点
                v=a.val+b.val+cin;
                a=a.next;b=b.next;
            }
            if(v>9){//若两数之和结点的值大于9;则进一位,cin=1
                cin=1;
            }else cin=0;//反之,无进位
            c.next=new ListNode(v%10);
            c=c.next;
        }
        if(cin>0) c.next=new ListNode(1);
        return sum.next;
    }
}

题目三:无重复字符的最长子串(中等)

题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例
1、输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
2、输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
3、输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
我的解法

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            int maxlen=0,len;
            if(s.length()==0) return maxlen;
           for(int i=0;i<s.length();i++){//从字符串第一个字符开始遍历寻找最长无重复子串
               StringBuilder str=new StringBuilder();//str用来存放无重复字符的子串
               str.append(s.substring(i,i+1));
               len=1;
               for(int j=i+1;j<s.length();j++){//依次检查当前字符是否在str中出现过
                   if(str.toString().contains(s.substring(j,j+1))){//若str中存在相同字符,结束本次循环
                       break;
                   }
                   else {//若str中没有出现过当前字符,则将当前字符添加到str中,本次循环中的str长度len值加一
                       str.append(s.substring(j,j+1));
                       len++;
                   }
               }
               maxlen=len>maxlen?len:maxlen;//比较当前循环的str长度和maxlen,记录其中较大者成为新的maxlen
           }
            return maxlen;
        }
    }

题目四:寻找两个有序数组的中位数(困难)

题目描述
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例
1、nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
2、nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
我的解法

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int l1=nums1.length,l2=nums2.length,l,i,j;
        l=l1+l2;
        double result=0.0;
        int[] a=new int[l];//声明数组a用来存放数组nums1和nums2按升序合并之后的数组元素
        if(l1==0){//若数组nums1为空
            a=nums2;
        }else if(l2==0){//若数组nums2为空
             a=nums1;
        }else{
            i=0;j=0;
            while(i<nums1.length||j<nums2.length){
                if(i>=nums1.length){//若数组nums1元素已排完,nums2还有未合并元素
                    a[i+j]=nums2[j++];
                }
                else if(j>=nums2.length){//数组nums2元素已排完,nums1还有未合并元素
                    a[i+j]=nums1[i++];
                }else{//数组nums1、nums2都还有未合并元素
                    a[i+j]=nums1[i]<nums2[j]?nums1[i++]:nums2[j++];//比较数组nums1和nums2中未合并的最小序号元素大小,并将较小元素放入数组a
                }
            }
            } 
        if(l%2==1) result=(double)a[(l-1)/2];//数组a中元素个数是奇数,返回数组中间位置的元素
            else result=(double)(a[l/2]+a[l/2-1])/2;//数组a中元素个数是偶数,返回数组中间位置两元素之和的一半
        return result;
        }
        
    }

题目五:最接近的三数之和(中等)

题目描述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例
给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

我的解法

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int mix=255;
        int sum,result=nums[0]+nums[1]+nums[2];
        for(int i=0;i<nums.length-2;i++){//三重循环暴力解决
            for(int j=i+1;j<nums.length-1;j++){
                for(int k=j+1;k<nums.length;k++){
                    sum=nums[i]+nums[j]+nums[k];
                    if(mix>Math.abs(target-sum))
                    {
                        result=sum;
                        mix=Math.abs(target-sum);
                        
                    }
                }
            }
        }
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值