leetcode 题解 java_leetcode-java题解(每天更新)

先给出一个leetcode的已有答案,为什么上来直接给出答案,因为这个好多答案写的都非常简洁,不太易懂,还是建议先自己做,答案只是参考http://www.ninechapter.com/solutions/。

1,https://leetcode.com/problems/two-sum/,题目大意是给出一个无序的数组和一个目标值,假设数组里有且只有两个数相加和目标值相等,按索引由小到大输出这两个数字的索引,从1开始索引。

思路:既然题目假设有两个数a,b肯定相加得到目标值c,那么肯定有c-a存在于数组中,于是问题转化成了如何高效检查一个数组中是否包含某个值,在这里找到一些答案http://www.diguage.com/archives/112.html。于是采用先排序,然后用Arrays.binarySearch的方法,然后根据OJ提示的一些错误,修改几下就好了。具体代码如下,254ms,和九章以及其他解题答案不太一样。

import java.util.Arrays;

public class Solution1 {

public static int[] twoSum(int[] numbers, int target)

{

int[] num = numbers.clone();

Arrays.sort(num);

int size = num.length;

int[] answers = new int[2];

for(int i=0;i

{

if(Arrays.binarySearch(num, target-num[i])>0)

{

int count=0,index1 = 0,index2=0;

for(int j=0;j

{

if(numbers[j]==num[i]||numbers[j]==target-num[i])

{

count++;

if(count==2)

{

index2=j;

answers[0] = (index1

answers[1] = (index1>index2?index1:index2)+1;

break;

}

else

{

index1=j;

}

}

}

}

}

return answers;

}

public static void main(String[] args)

{

int[] test = {-3,4,3,90};

int target = 0;

int[] result = {0,0};

result = twoSum(test,target);

System.out.println(result[0]+","+result[1]);

}

}

我先用第一种容易理解的方式AC,答案比较简单:

//solution1:先归并合并,再求中位数

public static double findMedianSortedArrays(int A[], int B[]) {

int[] C= mergeSortSub(A, B);

double result=0;

int n=C.length;

if(n%2==0)

{

double m1=0.5*n-1;

double m2=0.5*n;

result = 0.5*(C[(int) m1]+C[(int) m2]);

}else {

result = C[(int) Math.round(0.5*n-1)];

}

return result;

}

private static int[] mergeSortSub(int[] arr1,int[] arr2){//归并排序子程序

if(arr1.length==0)

{

return arr2;

}

if(arr2.length==0)

{

return arr1;

}

int[] result = new int[arr1.length+arr2.length];

int i = 0;

int j = 0;

int k = 0;

while(true){

if(arr1[i] 

result[k] = arr1[i];

if(++i>arr1.length-1){

break;

}

}else{

result[k] = arr2[j];

if(++j>arr2.length-1){

break;

}

}

k++;

}

for(;i

result[++k] = arr1[i];

}

for(;j

result[++k] = arr2[j];

}

return result;

}

public static void main(String[] args) {

int A[]={1,2,3,4};

int B[]={5,6,7,8};

double result = findMedianSortedArrays(A,B);

System.out.println(result);

}

答案2就是参考的九章里面的解法,读懂然后过一段时间默写。

这个比较简单,想清楚关键一点就是判断出重复后,从重复字符的下一索引继续开始,不要遗漏。

代码如下:

public class Solution3 {

public static int lengthOfLongestSubstring(String s) {

int len = s.length();

if(len==0)

{

return 0;

}

String string = null;

String subString = null;

int maxLength = 0;

for(int i=0;i

{

subString = String.valueOf(s.charAt(i));

if(i==0)

{

string = subString;

subString = null;

}else

{

if(!string.contains(subString))

{

subString = string+subString;

string = subString;

if(string.length()>maxLength)

{

maxLength = string.length();

}

subString = null;

}else

{

int index = string.indexOf(subString);

subString = string.substring(index+1)+subString;

string = subString;

if(string.length()>maxLength)

{

maxLength = string.length();

}

subString = null;

}

}

}

return maxLength;

}

public static void main(String[] args) {

String string = "dvdf";

int result = lengthOfLongestSubstring(string);

System.out.println(result);

}

}

4,等待更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值