数组
目录
- 数组中的最大值和最小值
- 找出数组中第二大的数
- 最大子数组之和
- 数组中重复最多的元素
- 数组中两两相加等于20的组合种数
- 一个数组循环右移k位
- 找出数组中第k个最小的数
- 数组中只出现一次的元素
- 数组中唯一的重复元素
- 递归方法求一个整数数组的最大元素
- 数对之差的最大值
- .绝对值最小的数
- 数组中两个元素的最小距离
- 指定数字在数组中第一次出现的位置
- 数组的两个子有序段进行合并
- 计算两个有序整型数组的交集
- 判断数组中数值是否连续相邻
- 求解数组中反序对的个数
- 最小三元组距离
1.数组中的最大值和最小值
寻找方法:
- 问题分解法
- 取单元素法
- 取双元素法
- 数组元素移位法
- 分治法
Java代码:
//方法3 public class minandmax { static int Max,Min; public static void getMaxandMin(int[] arr) { Max = arr[0]; Min = arr[0]; int len = arr.length; for(int i=1;i<len-1;i=i+2) { if(arr[i]>arr[i+1]) { if(arr[i]>Max) Max=arr[i]; if(arr[i+1]<Min) Min=arr[i+1]; } if(arr[i]<arr[i+1]) { if(arr[i+1]>Max) Max=arr[i+1]; if(arr[i]<Min) Min=arr[i]; } if(i+1>len) { if(arr[i]>Max) Max=arr[i]; if(arr[i]<Min) Min=arr[i]; } } } public static void main(String[] args) { int[] A= {7,3,19,40,4,7,1}; getMaxandMin(A); System.out.println("max="+Max); System.out.println("min="+Min); } }
2.找出数组中第二大的数
public class secondMax { public static void main(String[] args) { int[] A= {7,3,19,40,4,7,1}; System.out.println(getsecondMax(A)); } private static int getsecondMax(int[] arr) { // TODO Auto-generated method stub int count = arr.length; int maxnum = arr[0]; int secmax = Integer.MIN_VALUE; for(int i=1;i<count;i++) { if(arr[i]>maxnum) { secmax = maxnum; maxnum = arr[i]; } else { if(arr[i]>secmax) { secmax = arr[i]; } } } return secmax; } }
3.最大子数组之和
public class maxsubArr { public static void main(String[] args) { int[] A= {1,-2,4,8,-4,7,-1,-5}; System.out.println(getmaxsubArr1(A)); System.out.println(getmaxsubArr2(A)); System.out.println(getmaxsubArr3(A)); System.out.println("max = " + getmaxsubArr4(A)); System.out.println("begin = " + begin +" , end = " + end); } //方法一:蛮力法 public static int getmaxsubArr1(int[] arr) { // TODO Auto-generated method stub int len = arr.length; int sum,maxsum = 0,i,j,k; for(i=0;i<len;i++) { for(j=i;j<len;j++) { sum = 0; for(k=i;k<j;k++) sum+=arr[k]; if(sum>maxsum) maxsum=sum; } } return maxsum; } //方法二:重复利用已计算的子数组和 public static int getmaxsubArr2(int[] arr) { // TODO Auto-generated method stub int len = arr.length; int maxsum = Integer.MIN_VALUE; for(int i=0;i<len;i++) { int sum=0; for(int j=i;j<len;j++) { sum+=arr[j]; if(sum>maxsum) maxsum=sum; } } return maxsum; } //方法三:动态规划法 public static int getmaxsubArr3(int[] arr) { // TODO Auto-generated method stub int len = arr.length; int End[]=new int[len]; int All[]=new int[len]; End[len-1]=All[len-1]=arr[len-1]; End[0]=All[0]=arr[0]; for(int i=1;i<len;++i) { End[i] = max(End[i-1]+arr[i],arr[i]); All[i] = max(End[i],All[i-1]); } return All[len-1]; } public static int max(int m, int n) { // TODO Auto-generated method stub return m>n?m:n; } //方法四:优化动态规划法 private static int begin=0; private static int end=0; public static int getmaxsubArr4(int[] arr) { // TODO Auto-generated method stub int maxsum = Integer.MIN_VALUE; int sum = 0; int start = 0; for(int i=0;i<arr.length;i++) { if(sum<0) { sum = arr[i]; start = i; } else { sum+=arr[i]; } if(sum>maxsum) { maxsum=sum; begin = arr[start]; end = arr[i]; } } return maxsum; } }
4.数组中重复最多的元素
import java.util.*; public class findmaxfrequent { public static void main(String[] args) { int[] A= {1,5,4,2,4,4,5,4,5,5,6,6,6,6,6}; int num = maxfrequentnum(A); System.out.println("maxfrequentnum = "+num); } public static int maxfrequentnum(int[] arr) { // TODO Auto-generated method stub int result = 0; int len = arr.length; if(len==0) return Integer.MIN_VALUE; //记录次数 Map<Integer,Integer>m=new HashMap<Integer,Integer>(); for(int i=0;i<len;i++) { if(m.containsKey(arr[i])) { m.put(arr[i], m.get(arr[i])+1); } else m.put(arr[i],1); } //找出出现最多次数的元素 int maxfre = 0; Iterator iter = m.entrySet().iterator();//迭代器,map类型的必须先转换成集合类型才能使用迭代器去获取元素 //使用获取键值 while(iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); int key = (Integer)entry.getKey(); int val = (Integer)entry.getValue(); if(val>maxfre) { result = key; maxfre = val; } } System.out.println("maxfre = "+maxfre); return result; } }
5.数组中两两相加等于20的组合种数
import java.util.*; public class findsum { public static void main(String[] args) { int[] A= {1,7,17,2,6,3,14,10}; int n = 20; FindSum1(A,n); System.out.println(); FindSum2(A,n); } //蛮力法 public static void FindSum1(int[] arr, int n) { // TODO Auto-generated method stub int len = arr.length; for(int i=0;i<len;i++) { for(int j=i+1;j<len;j++) { if(arr[i]+arr[j]==n) System.out.println(arr[i]+","+arr[j]); } } } //排序法 public static void FindSum2(int[] arr, int n) { // TODO Auto-generated method stub Arrays.sort(arr); int begin = 0; int end = arr.length-1; while(begin<end) { if(arr[begin]+arr[end]<n) begin++; else if(arr[begin]+arr[end]>n) end--; else { System.out.println(arr[begin]+","+arr[end]); begin++; end--; } } } }
6.一个数组循环右移k位
public class torightk { public static void main(String[] args) { int[] A= {1,7,17,2,6,3,14,10}; int n = 2; for(int i=0;i<A.length;i++) { System.out.print(A[i]+" "); } System.out.println(); toRightk(A,n); for(int i=0;i<A.length;i++) { System.out.print(A[i]+" "); } } //三次逆序 public static void toRightk(int[] a, int k) { // TODO Auto-generated method stub int len = a.length; k = k % len; reverse(a,len-k,len-1); reverse(a,0,len-k-1); reverse(a,0,len-1); } public static void reverse(int[] a, int i, int j) { // TODO Auto-generated method stub for(;i<j;i++,j--) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } }
7.找出数组中第k个最小的数
public class kminandmax { public static void main(String[] args) { int[] A= {1,7,17,2,6,3,14,10}; int n = 2; int kmin = findkMin(A,n); int kmax = findkMax(A,n); System.out.println("数组中第"+n+"小的元素为:"+kmin); System.out.println("数组中第"+n+"大的元素为:"+kmax); } //剪枝发 public static int findkMin(int[] a, int k) { // TODO Auto-generated method stub if(a==null||a.length<k) return Integer.MIN_VALUE; return sort(a,0,a.length-1,k); } public static int findkMax(int[] a, int k) { // TODO Auto-generated method stub if(a==null||a.length<k) return Integer.MIN_VALUE; k = a.length-k; return sort(a,0,a.length-1,k); } public static int sort(int array[],int low,int high,int k){ int i,j; int index; if(low>=high) return Integer.MIN_VALUE; i=low+1; j=high; index=array[i]; while(i<j){ while(i<j&&array[j]>=index) j--; if(i<j){ array[i++]=array[j]; } while(i<j&&array[i]<index) i++; if(i<j) array[j--]=array[i]; } array[i]=index; if(i+1==k) return index; else if(i+1>k) return sort(array,low,i-1,k); else return sort(array,i+1,high,k); } }
8.数组中只出现一次的元素
public class onetimenum { public static void main(String[] args) { int[] A= {1,5,4,2,4,5,2,5,5,6,6,6,6}; int[] B= {1,2,1,2,4,2,4,4,1,3}; System.out.println("只出现一次的元素: "+findnum1(A)); int num = findnum2(B); System.out.println("只出现一次的元素: "+num); } //一个整数数组里除了一个数字以外,其他数字都出现两次。 public static int findnum1(int[] a) { // TODO Auto-generated method stub int len=a.length; int num=a[0]; for(int i=1;i<len;++i) num^=a[i]; return num; } //一个整数数组里除了一个数字以外,其他数字都出现两次以上。 public static int findnum2(int[] a) { // TODO Auto-generated method stub int len=a.length; int[] bitCount=new int[32]; for(int i=0;i<len;i++) for(int j=0;j<32;j++) bitCount[j]+=((a[i]>>j)&1); for(int i=0;i<len;i++) System.out.print(bitCount[i]); int appearone = 0; for(int i=0;i<32;i++) { if(bitCount[i]%3!=0) appearone+=(1<<i); } return appearone; } }
9.数组中唯一的重复元素
public class 唯一的重复元素 { public static void main(String[] args) { int[] A= {1,2,3,4,5,6,7,4}; System.out.println(onerepeatNum1(A)); System.out.println(onerepeatNum2(A)); } //求合法 public static int onerepeatNum1(int[] a) { // TODO Auto-generated method stub int len=a.length; int tmp1 = 0; int tmp2 = 0; for(int i=0;i<len;i++) { tmp1 += i; tmp2 += a[i]; } int num = tmp2-tmp1; if(num>=len) return Integer.MIN_VALUE; return num; } //异或法X^X=0 0^X=X public static int onerepeatNum2(int[] a) { // TODO Auto-generated method stub int len=a.length; int tmp1 = 0; for(int i=0;i<len;i++) { tmp1 ^= a[i]; } for(int i=0;i<len;i++) { tmp1 ^= i; } if(tmp1>=len) return Integer.MIN_VALUE; return tmp1; } }
10.递归方法求一个整数数组的最大元素
public class 数组的最大元素_递归 { public static void main(String[] args) { 数组的最大元素_递归 t =new 数组的最大元素_递归(); int[] num= {0,16,2,3,4,5,10,7,8,9}; System.out.println(t.findmax(num, 0)); } public int findmax(int[] num, int i) { // TODO Auto-generated method stub int len = num.length-i; if(len==1) return num[i]; else { return max(num[i],findmax(num,i+1)); } } private int max(int i, int j) { // TODO Auto-generated method stub return i>j?i:j; } }
11.数对之差的最大值
public class 数对之差的最大值 { public static void main(String[] args) { int[] num= {0,16,2,3,4,5,10,7,8,1}; System.out.println(getMax(num)); } public static int max(int m,int n){ return m>n?m:n; } public static int getMax(int[] a){ int len=a.length; if(a==null||len<=1) return Integer.MIN_VALUE; int diff=0; int max=a[0]; for(int i=1;i<len;i++){ diff=max(diff,max-a[i]); max=max(max,a[i]); } return diff; } }
12.绝对值最小的数
public class 绝对值最小的数 { public static int getMinAbs(int[] arr){ int len=arr.length; if(arr==null||len<1) return Integer.MIN_VALUE; int min=Integer.MAX_VALUE; for(int i=0;i<len;i++){ min=getMin(min,Math.abs(arr[i])); } for(int i=0;i<len;i++){ if(Math.abs(arr[i])==min) return arr[i]; } return Integer.MIN_VALUE; } public static int getMin(int m,int n){ return m<n?m:n; } public static void main(String[] args) { int[] num= {10,5,2,3,4,5,10,15,22,50}; System.out.println(getMinAbs(num)); } }
13.数组中两个元素的最小距离
public class 两个元素的最小距离 { public static int minDistance(int[] arr,int n1,int n2){ int len=arr.length; if(arr==null||len<2) return Integer.MIN_VALUE; int n1_index=-1; int n2_index=-1; int minDis=Integer.MIN_VALUE+1; for(int i=0;i<len;i++){ if(arr[i]==n1){ n1_index=i; if(n2_index>=0) minDis=getMin(Math.abs(minDis),Math.abs(n1_index-n2_index)); } if(arr[i]==n2){ n2_index=i; if(n1_index>=0){ minDis=getMin(Math.abs(minDis),Math.abs(n1_index-n2_index)); } } } return minDis; } public static int getMin(int n,int m){ return m<n?m:n; } public static void main(String[] args) { int[] num= {4,5,6,4,7,4,6,4,7,8,5,6,4,1,10,8}; System.out.println(minDistance(num,4,8)); } }
14.指定数字在数组中第一次出现的位置
public class 第一次出现的位置 { public static int firstTime(int[] arr,int n){ if (arr==null) return -1; int index=-1; for(int i=arr.length-1;i>=0;i--){ if(arr[i]==n) index=i+1; } return index; } public static void main(String[] args) { int[] num= {3,4,5,6,5,6,7,8,9,8}; System.out.println(firstTime(num,6)); } }
15.数组的两个子有序段进行合并
public class 两个子有序段进行合并 { public static void findMid(int[] a,int mid ){ int len=a.length; int tmp; for(int i=mid;i<len-1;i++){ if(a[i+1]<a[i]){ tmp=a[i]; a[i]=a[i+1]; a[i+1]=tmp; } } } public static void sort(int a[],int mid){ int tmp; for(int i=0;i<mid;i++){ if(a[mid]<a[i]){ tmp=a[i]; a[i]=a[mid]; a[mid]=tmp; findMid(a,mid); } } } public static void main(String[] args) { int[] num= {1,5,6,7,9,2,4,8,10,13,14}; sort(num,5); for(int i=0;i<num.length;i++) System.out.print(num[i]+" "); } }
16.计算两个有序整型数组的交集
public class 两个有序整型数组的交集 { public static void findMixed(int a[],int b[]){ ArrayList<Integer> list=new ArrayList<Integer>(); int i=0,j=0; int len1=a.length; int len2=b.length; while(i<len1&&j<len2){ if (a[i]==b[j]){ list.add(a[i]); i++; j++; } else if (a[i]<b[j]) i++; else j++; } for(int n:list) System.out.print(n+" "); } public static void main(String[] args) { int[] a= {0,1,2,3,4}; int[] b={1,3,5,7,9}; findMixed(a,b); } }
17.判断数组中数值是否连续相邻
public class 数值是否连续相邻 { public static Boolean isCountinue(int[] arr){ int len=arr.length; int min=-1,max=-1; for (int i=0;i<len;i++){ if(arr[i]!=0){ if(min>arr[i]||-1==min) min=arr[i]; if(max<arr[i]||-1==max) max=arr[i]; } } if(max-min>len-1) return false; else return true; } public static void main(String[] args) { int[] num= {0,5,4,9,3}; int[] num1={8,7,5,0,6}; System.out.println(isCountinue(num)); System.out.println(isCountinue(num1)); } }
18.求解数组中反序对的个数
public class 反序对的个数 { public static int reverse(int a[]) { int count = 0; int len = a.length; for (int i = 0; i < len; i++) { for (int j = i; j < len; j++) { if (a[i] > a[j]) { count++; System.out.println(a[i]+","+a[j]); } } } return count; } public static void main(String[] args) { int[] A = {1, 7, 17, 2, 6, 3, 14, 10}; System.out.println(reverse(A)); } }
19.最小三元组距离
public class 最小三元组距离 { public static int min(int a,int b,int c){ int min=a<b?a:b; min=min<c?min:c; return min; } public static int max(int a, int b, int c){ int max=a>b?a:b; max=max>c?max:c; return max; } public static int minDistance(int a[],int b[],int c[]){ int alen=a.length; int blen=b.length; int clen=c.length; int curDis=0; int min=0; int minDis=Integer.MAX_VALUE; int i=0,j=0,k=0; while(true){ curDis=max(Math.abs(a[i]-b[j]),Math.abs(a[i]-c[k]),Math.abs(b[j]-c[k])); if(curDis<minDis) minDis=curDis; min=min(a[i],b[j],c[k]); if(min==a[i]){ if(++i>=alen) break; } else if(min==b[j]){ if(++j>=blen) break; } else{ if(++k>=clen) break; } } return minDis; } public static void main(String[] args) { int[] num1= {3,4,5,7}; int[] num2={10,12,14,15,17}; int[] num3={20,21,23,24,37,30}; System.out.println(minDistance(num1,num2,num3)); } }