1)长为N的数组A,元素大小范围是1~N-1,写一个算法判断数组A里是否有重复元素,要求复杂度为 O(n)。
import java.util.HashMap; import java.util.Map; public class DuplicateNum { public boolean duplicateNum(Object[] a) { Map<Object,Integer> map= new HashMap<Object,Integer>(); for(int i=0;i<a.length;i++) { if(map.containsKey(a[i])) return true; map.put(a[i],1); } return false; } }
2)一个数组比如 int a[] = {1,2,3,-6,2,4},求其最大的两个子数组的和,比如a数组分为{1,2,3}和{2,4},所以和为6+6 = 12
import java.util.ArrayList; import java.util.Iterator; import java.util.List;
public class MaxSubSum { List<Integer> list=new ArrayList<Integer>(); List<Integer> list2=new ArrayList<Integer>(); public int maxReslt(int[] a) { int result; int max1=maxSubSum(a); Iterator<Integer> it=list.iterator(); while (it.hasNext()) { list2.add(it.next()); } int size1=list.size(); int max2=maxSubSum(a); if(size1>1&&max2<0) result=max1; else result=max1+max2; return result; } private int maxSubSum(int[] a)//求数组中自序列中和最大的序列 { int max; if(list2.size()!=0&&a[0]==a[list2.get(0)]) max=a[list2.size()]; else max=a[0]; int sum=0; int i=0; List<Integer> temp=new ArrayList<Integer>() ; while(i<a.length) { if(list2.size()!=0&&i==list2.get(0)) { i=i+list2.size(); sum = 0; temp.clear(); } else { temp.add(i); sum = sum + a[i]; if (sum >= max) { max = sum; List<Integer> list1=new ArrayList<Integer>(); Iterator<Integer> it=temp.iterator(); while (it.hasNext()) { list1.add(it.next()); } list=list1; } if (sum <= 0) { sum = 0; temp.clear(); } ++i; } } return max; } }
3)一个数组比如int a[] = {1,2,-3,2,4,-1,7},求其最大子数组的和的大小。比如a的最大子数组是{2,4,-1,7},所以最大子数组和为12.(注意第二题和第三题子数组的定义不同)
public class MaxSubSum { public int maxSubSum(int[] a)//求数组中自序列中和最大的序列 { int max; max=a[0]; int sum=0; int i=0; List<Integer> temp=new ArrayList<Integer>() ; while(i<a.length) { temp.add(i); sum = sum + a[i]; if (sum >= max) { max = sum; } if (sum <= 0) { sum = 0; temp.clear(); } ++i; } return max; } }
其中题2)是题3)的变体,其求解编程思想就是受题3)的影响,由题1)改变而来的,是求两次最大数组自序列的和