数组经典示例

旋转子数组

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        
        if(array.length == 0){
            return 0;
        }
        int left = 0;
        int right = array.length - 1;
        int min = 0;
        while(left <= right){
            if(array[left] <= array[right]){
                min = array[left];
            }
            int mid = (right + left)/2;
            if(array[mid] > array[right]){
                left = mid + 1;
            }else if(array[mid] < array[right]){
                right = mid;
            }else{
                right--;
            }
        }
        return min;
    }
}

 

斐波那契数列

public class Solution {
    public int Fibonacci(int n) {
        if(n < 2){
            return n;
        }
        int first = 0;
        int seconds = 1;
        int sum = 1;
        for(int i = 2; i <= n; ++i){
            sum = first + seconds;
            first = seconds;
            seconds = sum;
        }
        return sum;
    }
}


调整数组使得奇数在前偶数在后并且不能改变相对位置

public class Solution {
    public void reOrderArray(int [] array) {
        
        //插入排序的思想
       for(int i = 1; i < array.length; ++i){

            for(int j = i; j > 0;--j){
                //满足元素交换的条件
                if(array[j] % 2 == 1 && array[j - 1] % 2 == 0){
                    int temp = array[j - 1];
                    array[j-1] = array[j];
                    array[j] = temp;
                }else{
                    break;
                }

            }
        }
        
        
    }
}

顺时针打印矩阵

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       
        
        if(matrix == null){
            return null;
        }
        int x1 = 0;
        int y1 = 0;
        int x2 = matrix.length -1 ;
        int y2 = matrix[0].length - 1;
        ArrayList<Integer> ret = new ArrayList<>();
        while( x1 <= x2 && y1 <= y2){
            print(x1++,y1++,x2--,y2--,matrix,ret);
        }
        return ret;
    }
    public void print(int x1,int y1,int x2,int y2,int[][] matrix,ArrayList<Integer> ret){
        
        //打印第一行
        for(int i = y1; i <= y2; ++i){
            ret.add(matrix[x1][i]);
        }
        //打印右侧
        if(x2 - x1 == 0){
            return;
        }else{
            for(int i = x1 + 1; i <= x2; ++i){
                ret.add(matrix[i][y2]);
            }
        }
        //打印下边
        if(y2 - y1 == 0){
            return;
        }else{
            for(int i = y2 - 1; i >= y1; --i){
                ret.add(matrix[x2][i]);
            }
        }
        //打印最右边
        for(int i = x2 - 1; i > x1; --i){
            ret.add(matrix[i][y1]);
        }
    }
}

数组中出现次数超过一半的数字

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        
        if(array == null){
            return 0;
        }
        
        int count = 1;
        int ret = array[0];
        for(int i = 1; i < array.length; ++i){
            
            if(count == 0){
               ret = array[i];
               count++;
            }else if(ret != array[i]){
                count--;
            }else{
                count++;
            }
            
        }
        count = 0;
        for(int i  = 0; i < array.length; ++i){
            if(ret == array[i]){
                count++;
            }
        }
        if(count > array.length/2){
            return ret;
        }
        return 0;
    }
}

最小的k个数

import java.util.*;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        
         ArrayList<Integer> arr = new ArrayList<>();
        if(input == null || input.length < k){
            return arr;
        }
        Queue<Integer> heap = new PriorityQueue<>();
        for(int i = 0; i < input.length; ++i){
            heap.add(input[i]);
        }
       
        while(k-- != 0){
            arr.add(heap.poll());
           
        }
        return arr;
    }
}

最大连续子数组

import java.util.*;
public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        
        int[] dp = new int[array.length];
        dp[0] = array[0];
        int sum = array[0];
        for(int i = 1; i < array.length; ++i){
            
            
            dp[i] = Math.max(dp[i-1] + array[i],array[i]);
            
            sum = Math.max(dp[i],sum);
        }
        return sum;
    }
}

数组排成最小的数

import java.util.ArrayList;
import java.util.*;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        
        if(numbers == null){
            return null;
        }

        ArrayList<String> arr = new ArrayList<>();
        for(int i:numbers){
            arr.add(Integer.toString(i));
        }

        Collections.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                String A = o1 + o2;
                String B = o2 + o1;

                return A.compareTo(B);
            }
        });
        String str = "";
        for(String s:arr){
            str = str + s;
        }
        return str;

    }
}

在升序数组中元素出现的次数

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
       
        
        int left = 0;
        int right = array.length -1;
        //int index = -1;
        int count = 0;
        while(left <= right){

            int mid = (left + right)/2;
            if(array[mid] <k){
                left = mid + 1;
            }else if(array[mid] > k){
                right = mid -1;
            }else{
                count = 1;
                int first = mid - 1;
                int second = mid + 1;
                while(first >=0 || second<=array.length-1){

                    if(first>=0 && array[first] == k){
                        first--;
                        count++;
                        continue;
                    }
                    if(second <= array.length-1 && array[second] == k){
                        second++;
                        count++;
                        continue;
                    }
                    break;
                }
                break;
            }

        }

        return count;
    }
}

数组中只出现一次的数字

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
import java.util.*;
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        
        int tmp = 0;
        for(int i:array){
            
            tmp ^= i;
        }
        ArrayList<Integer> arr1 = new ArrayList<>();
        ArrayList<Integer> arr2 = new ArrayList<>();
        int index = 0;
        while(((tmp >> index++) & 1) == 1){}
        
        for(int i:array){
            
            if(((i >> index)&1) == 1){
                arr1.add(i);
            }else{
                arr2.add(i);
            }
        }
        for(int i:arr1){
            num1[0] ^= i;
        }
        for(int i:arr2){
            num2[0] ^= i;
        }
    }
}

和为s的两个数字

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        int left = 0;
        int right = array.length - 1;
        int result = Integer.MAX_VALUE;
        int flag = 0;
        ArrayList<Integer> arr = new ArrayList<>();
        int[] tmp = new int[2];
        while (left <= right) {

            if (array[left] + array[right] < sum) {
                left++;
            } else if (array[left] + array[right] > sum) {
                right--;
            } else {
                flag = 1;
                 if (array[left] * array[right] < result) {
                      tmp[0] = array[left];
                      tmp[1] = array[right];
                      result = array[left]*array[right];
                  }
                left++;
            }
        }
        if (flag == 1) {
            arr.add(tmp[0]);
            arr.add(tmp[1]);
        }
        return arr;
    }
    
}
    

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值