前言
许多年了,果然我还是不喜欢写文章这类活动,包括写博客在内,虽然也并不是无事可写,但丰 是丰富的感性使得我有太多的灵光一闪,想细细写下却又因为斟字酌句而失了原本的味道,因此不如弃笔不 写。不过年岁渐长,所思所想又与先时不同,故此,准备开启我的博客之旅,记录下成长的点点滴滴, 不仅加深印象也锻炼文笔,更重要的是想要改掉拖延症,养成良好的习惯,慢慢提升自己的技术水平。
那么,前言以毕,话不多说,下面就是我为锻炼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;
}
}