前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >有序数组中与任意数组查找不同的部分-二分查找

有序数组中与任意数组查找不同的部分-二分查找

作者头像
sr
发布于 2018-08-20 02:13:39
发布于 2018-08-20 02:13:39
1.4K00
代码可运行
举报
文章被收录于专栏:swag codeswag code
运行总次数:0
代码可运行

题目:在一串有序数组中,给出一串随机数组查找其中不同的部分

数组A:{2,3,5,8,9,11}

数组B:{9,8,2,10,1}

结果:10,1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

public class GetAllNotIncluded {

	// 利用二分查找查找与子串不同的部分
	public static List<Integer> getAllNotIncluded(int A[], int B[]) {
		List<Integer> res = new ArrayList<>();
		for (int i = 0; i < B.length; i++) {
			int L = 0;
			int R = A.length - 1;
			boolean flag = false;
			while (L <= R) {
				int mid = L + ((R - L) >> 1);
				if (A[mid] == B[i]) {
					flag = true;
					break;
				}
				if (A[mid] > B[i]) {
					R = mid - 1;
				} else {
					L = mid + 1;
				}
			}
			if (!flag) {
				res.add(B[i]);
			}

		}

		return res;

	}
	//比较函数
	public static List<Integer> comparator(int A[],int B[]){
		List<Integer> res =new ArrayList<>();
		for(int i=0;i<B.length;i++) {
			boolean flag=false;
			for(int j=0;j<A.length;j++) {
				if(A[j]==B[i]) {
					flag=true;
					break;
				}
			}
			if(!flag) {
				res.add(B[i]);
			}
		}
		return res;
	}
	
	//获取随机数组
	public static int[] getRandomArray(int maxSize,int maxValue) {
		int[] arr=new int[(int)((maxSize+1)*Math.random())];
		for(int i=0;i<arr.length;i++) {
			//获取 -maxVlaue + 1 ~ maxValue 的值
			arr[i]=(int)((maxValue+1)*Math.random())-(int)(maxValue*Math.random());
		}
		
		
		return arr;
		
	}
	public static boolean isEqual(List<Integer> list1,List<Integer> list2) {
       if(list1.size()!=list2.size()) {
	return false;
}
	HashMap<Integer,Integer> map=new HashMap<>();
	for(Integer i : list1) {
		//如果没有A集合中的这个元素,则添加进集合
		if(!map.containsKey(i)) {
			map.put(i, 0);
		}
		//如果存在即更新对应value值
		map.put(i,map.get(i)+1);
	}
	for(Integer i:list2) {
		//如果不存在,则直接return false
		if(!map.containsKey(i)) {
			return false;
		}
		//如果重复存在的值 数量不同
		map.put(i,map.get(i)-1);
		
		if(map.get(i)<0) {//即第二个集合数量重复值多于第一个集合
			return false;
		}
	}
	return true;
}
	public static void main(String[] args) {
		int tests =50000;
		//有序的数组最大长度
		int sortedArrayMaxSize = 300;
		//未排序的数组最大长度
		int unsortedArrayMaxSize = 10;
		//变量范围
		int maxValue = 100;
		boolean flag = true;
		for (int i = 0; i < tests; i++) {
			int[] A = getRandomArray(sortedArrayMaxSize, maxValue);
			int[] B = getRandomArray(unsortedArrayMaxSize, maxValue);
			//二分查找-有序数组
			Arrays.sort(A);
			List<Integer> res1 = getAllNotIncluded(A, B);
			List<Integer> res2 = comparator(A, B);
			if (!isEqual(res1, res2)) {
				flag = false;
				break;
			}
		}
		System.out.println(flag ? "Nice!" : "Fucking fucked!");
		//例
		int A[]= {8,5,6,8,2,8,2,3,5,4,5,6,7,9,9,3,2,11,2,21,26};
		int B[]= {1,2,2,3,4,10};
		Arrays.sort(A);
		List<Integer> res1 = getAllNotIncluded(A, B);
		List<Integer> res2 = comparator(A, B);
		Iterator it1=res1.iterator();
		Iterator it2=res1.iterator();
		while(it1.hasNext()) {
			System.out.print(it1.next()+" ");
		}
		System.out.println();
		while(it2.hasNext()) {
			System.out.print(it2.next()+" ");
		}

	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SmallSum-归并排序-小和问题(逆序对)
例如:数组[4,2,5,1,7,3,6] 第一个元素4比2大,不算小和,5比4和2都大,那就是4+2=6;1比4和2和5都小,不算小和;7比前面的都大,那就是上次小和6+4+2+5+1=18;然后3前面比2和1大,那就是18+2+1=21;最后6比4、2、5、1、3都大,结果就是21+4+2+5+1+3=36。那么最后的结果就是36。
sr
2018/08/20
5300
BucketSort-桶排序-计数排序
import java.util.Arrays; public class BucketSort { //桶排序-计数排序 public static void bucketSort(int[] arr){ if(arr==null||arr.length<2) { return ; } int max=Integer.MIN_VALUE; for(int i=0;i<arr.length;i++) { max=Math.max(max, arr[i]); } i
sr
2018/08/20
2580
MaximumGap-桶排序-最大间隔问题
题意:给定一个未排序的数组,返回其排序后的数组中 相邻元素之差 最大的值。 比如给定:[5,9,8,3,15] 排序后为:[3,5,8,9,15],相邻元素之差最大的是15-9=6,返回6。 复杂度要求:时间空间均为O(n)。 import java.util.Arrays; public class MaximumGap { // 桶排序-相邻最大值 public static int maximumGap(int[] arr) { if (arr == null || arr.length
sr
2018/08/20
3870
二分查找总结
二分查找是在每次匹配后,将查找的空间一分为二的算法,二分查找应该是有序的数组进行查找.
Tim在路上
2020/08/04
4780
【day09】LeetCode(力扣)每日一刷[1640. 能否连接形成数组 ][102. 二叉树的层序遍历 ][704. 二分查找 ]
解题思路: 为了验证pieces元素,是否可以连接形成数组arr,我们可以用双列集合map来存放数组pieces中的数组首元素以及下标。 再遍历地比较两个数组的元素; 如果存在两个数组的元素不对应,直接返回false即可; 具体操作可以看代码以及详细的注释:
.29.
2022/11/15
4020
【day09】LeetCode(力扣)每日一刷[1640. 能否连接形成数组 ][102. 二叉树的层序遍历 ][704. 二分查找 ]
Leetcode#442. Find All Duplicates in an nums(数组中重复的数据)
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
武培轩
2018/09/28
5220
LeetCode15|有序数组中出现次数超过25%的元素
给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
码农王同学
2020/08/12
3700
LeetCode15|有序数组中出现次数超过25%的元素
小和问题1 最直接方法2 归并方法
小和问题 在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组 的小和。 例子: [1,3,4,2,5] 1左边比1小的数,没有; 3左边比3小的数,1; 4左边比4小的数,1、3; 2左边比2小的数,1; 5左边比5小的数,1、3、4、2; 所以小和为1+1+3+1+1+3+4+2=16 1 最直接方法 依次遍历各元素左边 时间复杂度O(N) 2 归并方法 每次merge得出一个小和 package com.sss; /** * @author Shu
JavaEdge
2018/05/16
6640
对数器应用-SelectionSort-选择排序
import java.util.Arrays; public class SelectionSort { public static void selectionSort(int[] arr) { if (arr == null && arr.length < 2) { return; } for (int i = 0; i < arr.length - 1; i++) { // 当前位置标记为最小值 int minIndex = i; for (int j =
sr
2018/08/20
3420
前 K 个高频元素告诉你桶排序有啥用
今天分享的题目来源于 LeetCode 上第 347 号问题:前 K 个高频元素。题目难度为 Medium,目前通过率为 56.9% 。
五分钟学算法
2019/06/28
1K0
前 K 个高频元素告诉你桶排序有啥用
力扣
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100176.html原文链接:
全栈程序员站长
2021/05/21
1.4K0
力扣
LeetCode 题目解答——155~226 题
[Updated on 9/22/2017] 如今回头看来,里面很多做法都不是最佳的,有的从复杂度上根本就不是最优解,有的写的太啰嗦,有的则用了一些过于 tricky 的方法。我没有为了这个再更新,就让它们去吧。
四火
2022/07/19
7030
LeetCode 题目解答——155~226 题
[剑指offer] 和为S的两个数字
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
尾尾部落
2018/09/04
4740
堆和优先队列
  我们在常见的线性结构中,已经知道什么是普通队列了,普通队列就是一种“先进先出,后进后出”的数据结构,即普通队列的出队顺序和入队顺序是一样的,但我们的优先队列,它的出队顺序和入队顺序无关,它的出队顺序是和优先级相关的,当然这个优先级我们可以自己定义。
程序员波特
2024/01/19
1540
堆和优先队列
41 Group the People Given the Group Size They Belong To
There are n people whose IDs go from 0 to n - 1 and each person belongs exactly to one group. Given the array groupSizes of length n telling the group size each person belongs to, return the groups there are and the people’s IDs each group includes.
devi
2021/08/18
6620
LeetCode 图解 | 18.四数之和
今天分享的题目来源于 LeetCode 第 18 号题:四数之和,题目标签是:散列表、双指针和数组。
五分钟学算法
2020/02/20
4120
LeetCode 图解 | 18.四数之和
LeetCode 付费题目(一)
【题目】Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that shares the same parent node) or empty, flip it upside down and turn it into a tree where the original right nodes turned into left leaf nodes. Return the new root.
四火
2022/07/19
2.5K0
干货 | 手撕十大经典排序算法
当然,学算法是件相对枯燥的事情,不过,当你懂得算法这种思路之后,你会发现,算法真的是一个很神奇的东西,而且,算法引出的思想非常重要!!所以,千羽也会不断的学习死磕算法系列文章,和大家一起学习,一起进步。这篇文章主要讲解十大经典排序算法。话不多说,冲冲冲!
千羽
2021/12/29
4910
干货 | 手撕十大经典排序算法
增强for循环
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
秋落雨微凉
2022/10/25
1.3K0
增强for循环
堆排序和快排序笔记
一些相关的概念 堆是一棵顺序存储的完全二叉树。 大根堆:每个结点的值都大于或等于子结点的值,这样的堆称为大根堆。 小根堆:每个结点的值都小于或等于子结点的值,这样的堆称为小根堆。 建立一个大根堆的时间复杂度为O(N) 二叉树在数组中的表示:对于索引为K的父节点,其左孩子为(2K+1) 右孩子为( 2K+2)。一个节点的父节点索引为(K-1)/2。 堆排序的思想 将待排序的n个元素构造成一个大顶堆(小顶堆也可以,下面以大顶堆为例)。此时,这个序列的最大值就是大顶堆的根结点;然后,将大顶堆的根结点与堆数组中的最后一个元素进行交换,交换后,大顶堆的根结点存放的就是堆数组中的最后一个元素,大顶堆的根结点中存储的原始的最大值被移走啦;接着,将剩下的n-1个元素重新调整后,构造成一个新的大顶堆,重复上面的步骤,被移动的元素就构成了一个有序的数据。 整个步骤有两个关键操作 1.建立大根堆。从右至左,从下往上进行调整
用户5513909
2023/04/25
2310
堆排序和快排序笔记
相关推荐
SmallSum-归并排序-小和问题(逆序对)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验