数组经典例题(LeetCode)

LeetCode167
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

    public static void main(String[] args){
        int[] arr=new int[]{2,4,5,7};//创建一个升序排列的数组
        int num=6;//定义一个目标数
        int[] a=twoSum(arr,num);
        for(int i=0;i

本体思路:因为输入的是有序数组,通过运用双指针(i是较小数的位置,j是较大数的位置),求头尾两个元素的sum,若sum与target相比太小,i增大,若sum太大,j减小。

LeetCode169
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2

public static int majorityElement(int[] nums){
        int maj=nums[0];//将数组第一个数存入变量 用于与后面数字比较
        int count=1;//设置一个计数器
        for(int i=1;i

本题思路:从第一个数开始count=1,遇到相同的就加1,遇到不同的就减1,减到0就重新换个数开始计数,总能找到最多的那个。

LeetCode209
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
示例:
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。

 public static int minSubArrayLen(int s, int[] nums){//双指针 滑窗机制
            int len=0;//刚开始指针i、j重合,滑窗初始长度置为0
            int sum=0;
            int i=0;//i表示滑窗左边框
            for(int j=i;j=s){//当滑窗之间数的和大于等于目标数进入循环
                    len=len==0?j-i+1:Math.min(j-i+1,len);//取满足条件最小滑窗长度
                    sum=sum-nums[i];//滑窗长度减小后 滑窗间数的和应减去i所指向数字
                    i++;//i指针右移表示滑窗长度减小
                }
            }
        return len;
        }

本题思路:滑动窗口,在一个坐标上存在两个指针i和j ,i 代表滑窗的左边框,j代表滑窗的右边框。两者通过分别向右滑动,前者能使窗口之间的和减小,后者能使窗口之间的和增大。开始时二者重合,窗口的和就是重合点所在的数。

LeetCode240
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
示例:
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。

class LC240{
    public static void main(String[] args){
        int[][] arr=new int[][]{
            {1,4,7,11,15},
            {2,5,8,12,19},
            {3,6,9,16,22},
            {10,13,14,17,24},
            {18,21,23,26,30}
        };
        int num=5;
        System.out.print(searchMatrix(arr,num));
    }
    public static boolean searchMatrix(int[][] matrix, int target){
        if(matrix==null||matrix.length==0||matrix[0].length==0){//判空:数组为空 或数组长度为0 或数组(二维)内的数组长度为0 
            return false;
        }
        int m=matrix.length;
        int i=m-1;//左下角行标
        int j=0;//左下角列标
        while(i>=0&&j<=matrix[0].length-1){
        if(matrix[i][j]>target){
            i--;//先向上找,遇到的数大于目标数的话继续向上找 行减小(i--)
        }else if(matrix[i][j]

本题思路:因为数组从上到下递增,从左到右递增,所以从二维数组左下角开始找,先向上找,如果遇到的数比目标数大,继续向上找,直到比它小为止,遇到比它小的数后,开始向右找,直到比它小为止。总之按先上后右顺序进行查找,直到找到目标数。

LeetCode905
给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。

第一种方法:

class LC905{
    public static void main(String[] args){
        int[] arr=new int[]{3,1,2,4};
        sortArrayByParity(arr);
        for(int i=0;i

本题思路一:采用冒泡排序对相邻的两个数进行比较,如果前面的数为奇数,后面的数为偶数,则交换两个数,直到全部偶数在奇数前面。

第二种方法:

public static int[] sortArrayByParity(int[] A){//O(n)//双指针
        int L=0;//定义头指针
        int R=A.length-1;//定义尾指针
        while(L

本题思路二:采用双指针法,定义一个头指针指向数组第一个数和一个尾指针指向数组最后一个数,如果头指针所指的数为偶数,尾指针所指的数为奇数,头指针右移,尾指针左移,如果头指针所指的数为奇数,尾指针所指的数为偶数,先交换两个数后头指针右移,尾指针左移,如果头指针所指的数为偶数,尾指针所指的数为偶数,头指针右移,如果头指针所指的数为奇数,尾指针所指的数为奇数,尾指针左移。

你可能感兴趣的:(数组经典例题(LeetCode))