Array算法题详细解析

Array算法题详细解析

数组相关的算法题目是比较高频的,通过本文希望能够对你数组相关的算法能力有所帮助。

找出给定数组中的最大和最小元素

问题描述:

给你一个数字数组。你需要在数组中找到最小和最大的数。

思路

  • 定义两个变量max,min,用来存放最大和最小元素
  • 遍历数组
    • 如果当前元素大于max,则将当前元素赋值给max
    • 如果当前元素小于min,则将当前元素赋值给min
  • 最后max和min则是最大和最小的元素

代码实现:

public class FindLargestSmallestNumberMain {

    public static void main(String[] args) {

        int arr[] = new int[]{12,56,76,89,100,343,21,234};
        //将第一个元素赋值给
        int min = arr[0];
        int max = arr[0];

        for(int i=1; i< arr.length; i++)
        {
            if(arr[i] > max)
                max = arr[i];
            else if (arr[i] < min)
                min = arr[i];
        }
        System.out.println("Smallest Number is : " + min);
        System.out.println("max Number is : " + max); 
    }
}

复制代码

查找数组中缺少的数字

问题描述:

给定一个包含1到n的整数递增数组,但数组中从1到n的一个数字缺失了。你需要提供一个最佳的解决方案来找到丢失的数字。数字不会在数组中重复。

例如:

int[] arr1={7,5,6,1,4,2};
Missing number : 3
int[] arr2={5,3,1,2};
Missing number : 4
复制代码

思路:

  • 因为数组中元素是递增的,所以可以使用公式n=n*(n+1)/2求n个数的和
  • 计算出给定数组中元素的和
  • 使用n个数的和减去数组中元素的和结果便是缺少的数字

代码实现:

public class MissingNumberMain {
 
    public static void main(String[] args) {
 
        int[] arr1={7,5,6,1,4,2};
        System.out.println("Missing number from array arr1: "+missingNumber(arr1));
        int[] arr2={5,3,1,2};
        System.out.println("Missing number from array arr2: "+missingNumber(arr2));
 
    }
 
    public static int missingNumber(int[] arr)
    {
        int n=arr.length+1;
        int sum=n*(n+1)/2;
        int restSum=0;
        for (int i = 0; i < arr.length; i++) {
            restSum+=arr[i];
        }
        int missingNumber=sum-restSum;
        return missingNumber;
    }
}
复制代码

从旋转的有序数组中查找元素

问题描述:

给定一个排序和旋转的数组,如下所示:

int arr[]={16,19,21,25,3,5,8,10};
复制代码

该数组是从一个有序数组arr[]={3,5,8,10,16,19,21,25}旋转后所得。

要求在在O(log n)时间复杂度的数组中搜索到一个指定元素。

思路:

  • 如果直接遍历数组,则时间复杂度为O(n),不符合题目要求;
  • 因为数组是由有序数组旋转所得,所以在某个下标的之前和之后是有序的;
  • 然后按照二分法查找。

算法逻辑:

  • 计算出中位下标mid=(low+high)/2;
  • 如果arr[mid]等于要查找的数字则返回;
  • 如果[low...mid]是有序的;
    • 如果要查找的数字在[low...mid],则high=mid-1;
    • 如果要查找的数字不在[low...mid],则low=mid+1;
  • 如果[mid...high]是有序的;
    • 如果要查找的数字在[mid...high],则low=mid+1;
    • 如果要查找的数字不在[mid...high],则high=mid-1;

代码实现:

public class SearchElementSortedAndRotatedArrayMain {

    public static void main(String[] args) {
        int arr[] = {16, 19, 21, 25, 3, 5, 8, 10};
        System.out.println("Index of element 5 : " + 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值