java算法之Search for a Range

问题:Search for a Range

Given an array of integers sorted in ascending order, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].


思路:因为题目要求用 O(log n)时间复杂度,所以我们考虑用二分查找方法,我们只需要找到一个target的位置,

然后指定两个指针,分别从target位置依次向前向后遍历,找到所有的target值就好。。题目不难


代码:

import java.util.Arrays;

public class SearchOfRange {

	public static void main(String[] args) {
		int[] a=new int[] {8,8,8,8,8,10};
		int target=8;
		int []result=searchRange(a, target);
		System.out.println(Arrays.toString(result));
		
	}
	public static int[] searchRange(int []a, int target) {
		int end=a.length;
		int start=0;
		int mid=0;
		while(start<end) {
			 mid=(end+start)/2;
			if(a[mid]<target) {	
				end=mid-1;
			}
			if(a[mid]>target) {
				start=mid+1;
			}else break;
				
		}
		
		int []result=new int[2];
		
		if(a[mid]==target) {
			int rangeStart=mid;
			int rangeEnd=mid;
			//这里rangStart不能等于0,如果等于0的话,rangeStart-1则为-1
			while(rangeStart>0&&a[rangeStart-1]==target) rangeStart--;
			while(rangeEnd<a.length-1&&a[rangeEnd+1]==target) rangeEnd++;
			result[0]=rangeStart;
			result[1]=rangeEnd;
		}else {
			result[0]=-1;
			result[1]=-1;
		}
		
		return result;
	}
}




### Java 算法 API 文档及用法 Java 提供了丰富的标准库来支持各种算法实现和调优。以下是关于 Java 中与算法相关的 API 及其具体用法: #### 1. 集合框架中的算法工具 Java 的 `Collections` 类提供了许多静态方法,用于操作集合(如列表、集等)。这些方法实现了常见的算法逻辑,例如排序、查找、反转等。 - **排序**: 使用 `Collections.sort()` 方法可以对 `List` 进行自然顺序或自定义比较器下的排序[^2]。 ```java List<Integer> list = Arrays.asList(5, 3, 8, 1); Collections.sort(list); // 自然顺序排序 ``` - **二分查找**: 如果目标集合已经有序,则可以通过 `Collections.binarySearch()` 执行高效的二分查找。 ```java int index = Collections.binarySearch(list, 3); // 查找元素 '3' 的索引 ``` #### 2. Stream API 支持的功能性算法 自从 Java 8 引入 Streams 后,开发者能够以声明式风格编写复杂的聚合操作(如过滤、映射、规约等),从而简化了许多传统循环逻辑。 - **求和运算**: 利用 `IntStream.range()` 结合 `reduce()` 实现累加计算[^4]: ```java int sum = IntStream.range(1, 10).reduce(0, (i, j) -> i + j); System.out.println(sum); // 输出结果为45而非题目描述中的错误值10 ``` - **筛选条件**: 借助 lambda 表达式完成基于特定规则的数据提取过程: ```java List<String> filteredNames = names.stream() .filter(name -> name.length() > 5) .collect(Collectors.toList()); ``` #### 3. 数学运算类 Math/BigInteger 对于高精度数值或者复杂算术表达式的场景下,推荐选用专门设计好的数学辅助类别来进行处理。 - **随机数生成**: 调用 `Math.random()` 函数获取介于 [0.0 , 1.0) 区间内的伪随机浮点数;如果需要整型范围则需额外转换[^3]. - **大整数乘方模运算**: 当涉及超大数据量级时应考虑采用 BigInteger 来代替原始类型 long ,因为它允许任意长度并内置多种实用方法比如 modPow()[^5]. ```java BigInteger base = new BigInteger("2"); BigInteger exponent = new BigInteger("1000"); BigInteger modulus = new BigInteger("1009"); System.out.println(base.modPow(exponent,modulus)); // 计算 (2 ^ 1000) % 1009 ``` #### 4. 加密算法相关接口 现代软件开发离不开安全机制的支持,在这方面 JDK 内置了不少成熟的解决方案可供选择,其中包括但不限于哈希摘要、消息认证码MAC以及公私钥体系等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值