数组

目录

  1. 数组中的最大值和最小值
  2. 找出数组中第二大的数
  3. 最大子数组之和
  4. 数组中重复最多的元素
  5. 数组中两两相加等于20的组合种数
  6. 一个数组循环右移k位
  7. 找出数组中第k个最小的数
  8. 数组中只出现一次的元素
  9. 数组中唯一的重复元素
  10. 递归方法求一个整数数组的最大元素
  11. 数对之差的最大值
  12. .绝对值最小的数
  13. 数组中两个元素的最小距离
  14. 指定数字在数组中第一次出现的位置
  15. 数组的两个子有序段进行合并
  16. 计算两个有序整型数组的交集
  17. 判断数组中数值是否连续相邻
  18. 求解数组中反序对的个数
  19. 最小三元组距离

 

 

1.数组中的最大值和最小值

寻找方法:

  1. 问题分解法
  2. 取单元素法
  3. 取双元素法
  4. 数组元素移位法
  5. 分治法

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));
    }
}

 

转载于:https://www.cnblogs.com/jocelynD-9/p/11268132.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值