给定一个有序数组arr,代表坐落在X轴上的点

2024-05-08 19:32

本文主要是介绍给定一个有序数组arr,代表坐落在X轴上的点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


/*** 题目:* 给定一个有序数组arr,代表坐落在X轴上的点* 给定一个正数K,代表绳子的长度* 返回绳子最多压中几个点?* 即使绳子边缘处盖住点也算盖住*/
public class Code01_CordCoverMaxPoint {//算法1 贪心+二分public static int maxPoint1(int[] arr, int L) {int res = 1;for (int i = 0; i < arr.length; i++) {//算出当前点像前最多能压几个点int nearest = nearestIndex(arr, i, arr[i] - L);res = Math.max(res, i - nearest + 1);}return res;}// R当前下标志  value 是要找的值public static int nearestIndex(int[] arr, int R, int value) {int L = 0;int index = R;while (L <= R) {//>>位移  右移int mid = L + ((R - L) >> 1);if (arr[mid] >= value) {index = mid;R = mid - 1;} else {L = mid + 1;}}return index;}//算法2 窗口法public static int maxPoint2(int[] arr, int L) {int left = 0;int right = 0;int N = arr.length;int max = 0;//假定窗口left 到right 判断每个点到后面最多能盖几个点,然后每个点都出个结果,比较最大的while (left < N) {//当前点根据绳子长度像后覆盖点,直到 没有数 可以延伸或者 大于绳子长度Lwhile (right < N && arr[right] - arr[left] <= L) {right++;}//比较旧覆盖点和新覆盖点哪个大就留哪个max = Math.max(max, right - (left++));}//关键是right不会向后退,就像个窗口一样,而算法一需要每次都二分去查找覆盖的点return max;}// for test 测试算法public static int test(int[] arr, int L) {int max = 0;for (int i = 0; i < arr.length; i++) {int pre = i - 1;while (pre >= 0 && arr[i] - arr[pre] <= L) {pre--;}max = Math.max(max, i - pre);}return max;}// for test 获取数组public static int[] generateArray(int len, int max) {int[] ans = new int[(int) (Math.random() * len) + 1];for (int i = 0; i < ans.length; i++) {ans[i] = (int) (Math.random() * max);}Arrays.sort(ans);return ans;}public static void main(String[] args) {//数组长度100个int len = 100;//随机数大小1-到1000int max = 1000;//测试次数int testTime = 100000;System.out.println("测试开始");for (int i = 0; i < testTime; i++) {//随机绳子长度int L = (int) (Math.random() * max);//生成数组int[] arr = generateArray(len, max);//测试算法1int ans1 = maxPoint1(arr, L);//测试算法2int ans2 = maxPoint2(arr, L);//暴力测试int ans3 = test(arr, L);if (ans1 != ans2 || ans2 != ans3) {System.out.println("oops!");break;}}}}

        

这篇关于给定一个有序数组arr,代表坐落在X轴上的点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971228

相关文章

剑指offer(C++)--数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution {public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {int len = data.size();if(len<2)return;int one = 0;for(int i

在 Java 中,JDK、JRE、JVM 分别代表什么,有何关系和区别?

在Java开发的世界中,我们会经常听到JDK、JRE和JVM这三个词。它们都与Java的运行环境以及Java程序的编译和运行有关,它们之间也存在一些关联性和区别。 什么是JDK、JRE和JVM 我们来看它们分别是什么。 JDK,全称Java Development Kit,即Java开发工具包。顾名思义,JDK是用于Java开发的一套工具包,里面包含了Java的编译器javac、

IOS 数组去重的几种方式

本来只知道NSSet和KeyValues的。今天又新学了几种方式 还有就是和同事学的一种方式 外层循环从0开始遍历,内层从最后一个元素开始遍历 for(int i=0;i<index;i++){  for(int j=index-1;j>i;j-- ){ } }

iOS 到处 ipa包的时候 会有四个选项分别代表什么

如图 在 iOS 到处 ipa包的时候 会有四个选项  1.Save for iOS App Store Deployment 保存到本地 准备上传App Store 或者在越狱的iOS设备上使用 2.Save for Ad Hoc Deployment 保存到本地 准备在账号添加的可使用设备上使用(具体为在开发者账户下添加可用设备的udid),该app包是发布证书编

Java基础(二)——数组,方法,方法重载

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 + TS + Pinia + Element Plus + Spring全家桶 + MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步至千里,积小流成江海 🥇推荐学习:🍖开源 rich-vue3 🍍前端面试

poj 3882(Stammering Aliens) 后缀数组 或者 hash

后缀数组:  构建后缀数组,注意要在字符串莫末尾加上一个没出现过的字符。然后可以2分或者直接扫描,直接扫描需要用单调队列来维护 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string

poj 3294(Life Forms) 2分+ 后缀数组

我曾用字符串hash写,但是超时了。只能用后最数组了。大致思路:用不同的符号吧字符串连接起来,构建后缀数组,然后2分答案,依次扫描后缀数组,看是否瞒住条件。 VIEW CODE #include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<cstring>#include<cassert>#

C语言函数参数--数组长度

int read_column_numbers(int columns[], int max){} 在函数声明的数组参数中,并未指定数组的长度。这种格式是OK的,因为无论调用函数的程序传递给它的数组参数的长度是多少,这个函数都将照收不误。 这是一个伟大的特性,它允许单个函数操纵任意长度的一维数组。 这个特性不利的一面是函数没法知道该数组的长度。如果确实需要数组的长度,它的值必须作为一个单独的

从JavaScript 数组去重看兼容性问题,及性能优化(摘自玉伯博客)

缘由 JavaScript 数组去重经常出现在前端招聘的笔试题里,比如: 有数组 var arr = ['a', 'b', 'c', '1', 0, 'c', 1, '', 1, 0],请用 JavaScript 实现去重函数 unqiue,使得 unique(arr) 返回 ['a', 'b', 'c', '1', 0, 1, ''] 作为笔试题,考点有二: 正确。别小看这个考点

【Java】ArrayListString转化为String数组问题

Java的容器类Collections中toArray()方法,可以把诸如ArrayList<String>的动态数组、不定长转化静态数组、定长数组String[] 但是,如下的转化方式是错误的。 [java]  view plain copy String[] strArray = (String[]) arrayList.toArray();   如果这样执行会导致