当前位置:   article > 正文

leetcode-java题解(每天更新)_leetcode java解题报告

leetcode java解题报告

说明:选用java,重在体会,性能不是最优。欢迎转载:http://www.ming-yue.cn/leetcode-java-solutions/

先给出一个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,和九章以及其他解题答案不太一样。

  1. import java.util.Arrays;
  2. public class Solution1 {
  3. public static int[] twoSum(int[] numbers, int target)
  4. {
  5. int[] num = numbers.clone();
  6. Arrays.sort(num);
  7. int size = num.length;
  8. int[] answers = new int[2];
  9. for(int i=0;i<size;i++)
  10. {
  11. if(Arrays.binarySearch(num, target-num[i])>0)
  12. {
  13. int count=0,index1 = 0,index2=0;
  14. for(int j=0;j<size;j++)
  15. {
  16. if(numbers[j]==num[i]||numbers[j]==target-num[i])
  17. {
  18. count++;
  19. if(count==2)
  20. {
  21. index2=j;
  22. answers[0] = (index1<index2?index1:index2)+1;
  23. answers[1] = (index1>index2?index1:index2)+1;
  24. break;
  25. }
  26. else
  27. {
  28. index1=j;
  29. }
  30. }
  31. }
  32. }
  33. }
  34. return answers;
  35. }
  36. public static void main(String[] args)
  37. {
  38. int[] test = {-3,4,3,90};
  39. int target = 0;
  40. int[] result = {0,0};
  41. result = twoSum(test,target);
  42. System.out.println(result[0]+","+result[1]);
  43. }
  44. }

2,https://leetcode.com/problems/median-of-two-sorted-arrays/,题目大意是有两个有序数组AB,长度mn,求出这两个数组的中位数,log(m+n)。分两种思路,一是先归并成C,再求中位数;二是分别求出AB的中位数,利用二分查找找出最终结果,中位数的概念http://zh.wikipedia.org/wiki/%E4%B8%AD%E4%BD%8D%E6%95%B8

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

  1. //solution1:先归并合并,再求中位数
  2. public static double findMedianSortedArrays(int A[], int B[]) {
  3. int[] C= mergeSortSub(A, B);
  4. double result=0;
  5. int n=C.length;
  6. if(n%2==0)
  7. {
  8. double m1=0.5*n-1;
  9. double m2=0.5*n;
  10. result = 0.5*(C[(int) m1]+C[(int) m2]);
  11. }else {
  12. result = C[(int) Math.round(0.5*n-1)];
  13. }
  14. return result;
  15. }
  16. private static int[] mergeSortSub(int[] arr1,int[] arr2){//归并排序子程序
  17. if(arr1.length==0)
  18. {
  19. return arr2;
  20. }
  21. if(arr2.length==0)
  22. {
  23. return arr1;
  24. }
  25. int[] result = new int[arr1.length+arr2.length];
  26. int i = 0;
  27. int j = 0;
  28. int k = 0;
  29. while(true){
  30. if(arr1[i] < arr2[j]){
  31. result[k] = arr1[i];
  32. if(++i>arr1.length-1){
  33. break;
  34. }
  35. }else{
  36. result[k] = arr2[j];
  37. if(++j>arr2.length-1){
  38. break;
  39. }
  40. }
  41. k++;
  42. }
  43. for(;i<arr1.length;i++){
  44. result[++k] = arr1[i];
  45. }
  46. for(;j<arr2.length;j++){
  47. result[++k] = arr2[j];
  48. }
  49. return result;
  50. }
  51. public static void main(String[] args) {
  52. int A[]={1,2,3,4};
  53. int B[]={5,6,7,8};
  54. double result = findMedianSortedArrays(A,B);
  55. System.out.println(result);
  56. }

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

3,https://leetcode.com/problems/longest-substring-without-repeating-characters/,题目大意就是找出一个字符串中不重复的最长子串。

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

代码如下:

  1. public class Solution3 {
  2. public static int lengthOfLongestSubstring(String s) {
  3. int len = s.length();
  4. if(len==0)
  5. {
  6. return 0;
  7. }
  8. String string = null;
  9. String subString = null;
  10. int maxLength = 0;
  11. for(int i=0;i<len;i++)
  12. {
  13. subString = String.valueOf(s.charAt(i));
  14. if(i==0)
  15. {
  16. string = subString;
  17. subString = null;
  18. }else
  19. {
  20. if(!string.contains(subString))
  21. {
  22. subString = string+subString;
  23. string = subString;
  24. if(string.length()>maxLength)
  25. {
  26. maxLength = string.length();
  27. }
  28. subString = null;
  29. }else
  30. {
  31. int index = string.indexOf(subString);
  32. subString = string.substring(index+1)+subString;
  33. string = subString;
  34. if(string.length()>maxLength)
  35. {
  36. maxLength = string.length();
  37. }
  38. subString = null;
  39. }
  40. }
  41. }
  42. return maxLength;
  43. }
  44. public static void main(String[] args) {
  45. String string = "dvdf";
  46. int result = lengthOfLongestSubstring(string);
  47. System.out.println(result);
  48. }
  49. }

4,等待更新

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/990695
推荐阅读
相关标签
  

闽ICP备14008679号