date: 2015-09-13 16:32:49


Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

大意:求两个有序数组的中位数(中位数:奇数个即为中间数,偶数个为中间2个数均值)

解法1:(不考虑time complexity)

  1. public double findMedianSortedArrays2(int[] a, int[] b) {
  2. int alen=a.length;
  3. int blen=b.length;
  4. int[] result=new int[alen+blen];
  5. System.arraycopy(a, 0, result, 0, alen);
  6. System.arraycopy(b, 0, result, alen, blen);
  7. Arrays.sort(result);
  8. >>Arrays.parallelSort(result);并行排序在数量大于10K时,将明显体现<<
  9. int mid=result.length/2;
  10. if ((result.length)%2!=0) {
  11. return (double)result[mid];
  12. }
  13. else {
  14. return ((double)result[mid]+(double)result[mid-1])/2;
  15. }
  16. }

解法2:(考虑time complexity)

思路:

扩展为2个有序数组,求第K小的数,median是此情况特例。

寻找第K小的数(Kth),假如数组均是升序排列,中位数(奇数个即中间的数,偶数个是中间2个数的平均值)

几个步骤,暂不考虑b[index]的游标index如何更合适:

  1. 将2个数组按长短分为a[0,1,...,m-1],b[0,1,....,n-1],其中n>=m
  2. 分治法,将K/2,比较a[k/2-1]和b[k/2-1],第k小,即合并并后数组ab[k-1]!
  3. 三种情况,

一: a[k/2-1]b[k/2-1],则a[k/2-1]b[k/2-1]==第k小的数

二: a[k/2-1]< b[k/2-1],则a[0,...,k/2-1]中Kth必然不在此,因为a[0,...,k/2-1]加上b[0,...,k/2-1]总共才k个数,而a[k/2-1]<b[k/2-1],也就是Kth只可能存在a[k/2,..,m-1]和b[0,...,n-1]中

三: a[k/2-1]> b[k/2-1],则b[0,...,k/2-1]中Kth必然不在此,因为a[0,...,k/2-1]加上b[0,...,k/2-1]总共才k个数,而a[k/2-1]>b[k/2-1],也就是Kth只可能存在a[0,..,m-1]和b[k/2,...,n-1]中

Edge case:

  1. m==0;return b[k-1];
  2. k/2>m,此时,A[index]index直接取m-1,使用a[m-1];
  3. 递归过程中,k每次减去从两个数组中剔除数字的个数,所以k在自减,然后k/2分治在2个数组中,终止条件k<=1,Kth等于此时两个数组的首个的最小值
  4. a[min(k/2,m)-1],b[index],index如果取值k/2-1会使分治的区域中无法包含Kth,因为采用k-min(k/2,m),此处代码中有详解
  1. public double findMedianSortedArrays(int[] nums1, int[] nums2) {
  2. int k=nums1.length+nums2.length;
  3. int m=nums1.length;
  4. int n=nums1.length;
  5. if(k%2!=0)
  6. {
  7. return findKth(nums1, m, nums2, n,k/2+1);
  8. }
  9. else
  10. {
  11. return (findKth(nums1, m, nums2, n, k/2)+findKth(nums1, m, nums2, n, k/2+1));
  12. }
  13. }
  1. public double findKth(int[] a,int alen, int[] b,int blen, int k)
  2. {
  3. if(alen>blen)
  4. {
  5. return findKth(b, blen, a, alen, k);
  6. }
  7. if(alen==0)
  8. {
  9. return b[k-1];
  10. }
  11. if(k==1)
  12. return Math.min(a[0],b[0]);
  13. //>>游标pa,pb表示a,b的前pa,pb个数,将k进行分治,舍得pa+pb=k<<
  14. int pa=Math.min(k/2, alen);
  15. //>>当k为奇数时,若pb=k/2,则pa和pb两个游标不能涵盖kth:(k=3,pa=1,pb=1,pa+pb<k)<<
  16. int pb=k-pa;
  17. if (a[pa-1]<b[pb-1]) {
  18. return findKth(Arrays.copyOfRange(a, pa, alen), alen-pa, b, blen, k-pa);
  19. }
  20. else if (a[pa-1]>b[pb-1]) {
  21. return findKth(a, alen, Arrays.copyOfRange(b, pb, blen), blen-pb, k-pb);
  22. }
  23. else {
  24. return a[pa-1];
  25. }
  26. }

补充:关于copyOfRange()方法

public static long[] copyOfRange(long[] original, int from, int to)

参数:

original - 将要从其复制一个范围的数组

from - 要复制的范围的初始索引(包括)!!!!!!

to - 要复制的范围的最后索引(不包括)!!!!!!要复制全部的话,必须大于(不能等于最后索引)(此索引可以位于数组范围之外)

EOF 4

Longest Palindromic Substring

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

最长回文子串

思路:

单字符即是回文,有初始条件,可以联想到用DP

用个boolean flag[i][j]二维数组,表示从i到j是不是回文

  1. i=j,是回文(a)
  2. j=i+1,如果字符相当,是回文(aa)
  3. j>i+1, 判断string[j]=?string[i],相等的话,递归求flag[i+1][j-1]=?true,全部满足,则flag[i][j]=true(abba)

注意,TLE问题,substring()时间消耗挺大,避免循环中使用

public String substring(int beginIndex, int endIndex)

参数:

beginIndex - 起始索引(包括)

endIndex - 结束索引(不包括)又是不包括,注意+1

  1. public String longestPalindrome(String s) {
  2. if(s == null || s.length() <= 1) {
  3. return s;
  4. }
  5. int len = s.length();
  6. int start = 0, end = 0;
  7. boolean[][] flag = new flag[len][len];
  8. // 间距0
  9. for(int i=0;i<len;i++) {
  10. flag[i][i] = true;
  11. }
  12. // 间距1
  13. for(int i=1;i<len;i++) {
  14. if(s.charAt(i-1) == s.charAt(i)) {
  15. flag[i-1][i] = true;
  16. start = i-1; end = i;
  17. }
  18. }
  19. >>间距>=2!用k表示ji的间距,进行递增。每次从i=0开始寻找i+k后的j,<<
  20. >>判断flag[i][j]值,最终完成最大间距的flag[i][j],其中j-i is max!<<
  21. for(int k=2;k<len;k++) {
  22. for(int i=0;i+k<len;i++) {
  23. int j = i+k;
  24. if(s.charAt(i) == s.charAt(j) && flag[i+1][j-1]) {
  25. flag[i][j] = true;
  26. start = i; end = j;
  27. }
  28. }
  29. }
  30. return s.substring(start,end);
  31. }

EOF 5

ZigZag Conversion

ZigZag,直接上个表格,就明了了,以string=“abcdefghij”为例:

a g
b f h
c e i k
d j

思路:

  • 题目要求较简单,仅仅是返回一个经过Zigzag转化的字符串,所以考虑用StringBuilder
  • zigzag特点是,斜着的部分的个数是row-2,首行和末行是没有斜位的
  • StringBuilder一定要先初始化再用,否则报错,老是忘....
  1. public String convert(String s, int nRows) {
  2. char[] c=s.toCharArray();
  3. int len=c.length;
  4. StringBuilder[] StringBuilders=new StringBuilder[nRows];
  5. for (int i = 0; i < nRows; i++) {
  6. StringBuilders[i]=new StringBuilder();
  7. }
  8. int i=0;
  9. while(i<len)
  10. {
  11. for (int j = 0; j < nRows&&i<len; j++) {
  12. StringBuilders[j].append(c[i++]);
  13. }
  14. for (int j = nRows-2; j >=1&&i<len; j--) {
  15. StringBuilders[j].append(c[i++]);
  16. }
  17. }
  18. for (int j = 1; j < StringBuilders.length; j++) {
  19. StringBuilders[0].append(StringBuilders[j]);
  20. }
  21. return StringBuilders[0].toString();
  22. }

leetcode4568的更多相关文章

随机推荐

  1. c#.net循环将DataGridView中的数据赋值到Excel中,并设置样式

    Microsoft.Office.Interop.Excel.Application excel =                new Microsoft.Office.Interop.Excel ...

  2. jQuery DataTables && Django serializer

    jQuery DataTables https://www.datatables.net 本文参考的官方示例 http://datatables.net/release-datatables/exam ...

  3. 设计算法,求AB两个整数集合的交集

    [本文链接] http://www.cnblogs.com/hellogiser/p/ab-set-intersection.html [分析] 思路1:排序法 对集合A和集合B进行排序(升序,用快排 ...

  4. ACM/ICPC 之 Bellman Ford练习题(ZOJ1791(POJ1613))

    这道题稍复杂一些,需要掌握字符串输入的处理+限制了可以行走的时间. ZOJ1791(POJ1613)-Cave Raider //限制行走时间的最短路 //POJ1613-ZOJ1791 //Time ...

  5. Ubuntu 新建swap分区及启用

    个人电脑配置:500G机械硬盘+16G NGFF SSD+8G Physical Memory 之前安装Ubuntu16.04,默认装到NGFF的SSD里,/和swap分区一共才16G,于是删除swa ...

  6. 6.SpringMVC注解启用

    SpringMVC注解可以帮助我们快速地注入 属性和参数 提高开发效率. 由于 有相当一部分人讨厌xml配置方式 注解可以覆盖 xml则不能 使用注解比xml规范化,因为很多注解都是java的规范的范 ...

  7. BM算法和Sunday快速字符串匹配算法

    BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J St ...

  8. assign() 方法

    assign() 方法可加载一个新的文档. 语法 location.assign(URL) <html> <head> <script type="text/j ...

  9. jq获取绝对定位与相对定位的top, left值

    jquery 实现方法绝对var X = $('#ID').offset().top; var Y = $('#ID').offset().left; 相对var X = $('#ID').posit ...

  10. 25个增强iOS应用程序性能的提示和技巧(初级篇)

    25个增强iOS应用程序性能的提示和技巧(初级篇) 标签: ios内存管理性能优化 2013-12-13 10:53 916人阅读 评论(0) 收藏 举报  分类: IPhone开发高级系列(34)  ...