算法题——时间复杂度对比

计算两个有序整型数组的交集


题目两个含有n个元素和m个元素的有序(非降序)整型数组a和b(无重复元素),求出共同元素。 

注意点:数组有序且无重复值
如:a=0 1 2 3 4  b= 1 3 5 7   a和b交集为{1,3}
import java.util.Iterator;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class Code00_ArrayCollection {
	// 方法一:时间复杂度:O(n^m),空间复杂度:O(1)
	public static void fn1(int[] arr1, int[] arr2) {
		System.out.println("方法一:时间复杂度:O(n^m),空间复杂度:O(1)");
		for (int i = 0; i < arr1.length; i++) {
			// int tmp=arr1[i];
			for (int j = 0; j < arr2.length; j++) {
				if (arr1[i] == arr2[j]) {
					System.out.println(arr2[j]);
				}
			}
		}
	}

	// 方法二:时间复杂度:O(nlogm),空间复杂度:O(1)
	// 也可以为时间复杂度:O(mlogn),空间复杂度:O(1)
	// 二分法查找,前提是数组有序
	// 非递归
	public static void BinarySearch(int data, int[] arr) {
		int begin = 0;
		int end = arr.length - 1;
		int mid = 0;
		while (begin <= end) {
			mid = (begin + end) / 2;
			if (arr[mid] == data) {
				System.out.println(data);
				return;
			} else if (arr[mid] > data) {
				end = mid - 1;
			} else {
				begin = mid + 1;
			}
		}
	}

	// 递归
	public static void BinarySearchRecursion(int data, int[] arr, int begin,
			int end) {
		if (begin > end) {
			return;
		}
		int mid = (begin + end) / 2;
		if (arr[mid] == data) {
			System.out.println(data);
			return;
		} else if (arr[mid] > data) {
			BinarySearchRecursion(data, arr, begin, mid - 1);
		} else {
			BinarySearchRecursion(data, arr, mid + 1, end);
		}
	}

	public static void fn2(int[] arr1, int[] arr2) {
		System.out.println("方法二:时间复杂度:O(nlogm),空间复杂度:O(1)");
		for (int i = 0; i < arr1.length; i++) {
			// 非递归
			BinarySearch(arr1[i], arr2);
			// 递归
			BinarySearchRecursion(arr1[i], arr2, 0, arr2.length - 1);
		}

	}

	// 方法三:时间复杂度:O(n+m),空间复杂度:O(1)
	public static void fn3(int[] arr1, int[] arr2) {
		System.out.println("方法三:时间复杂度:O(n+m),空间复杂度:O(1)");
		int i = 0, j = 0;
		while (i != arr1.length && j != arr2.length) {
			if (arr1[i] > arr2[j]) {
				j++;
			} else if (arr1[i] < arr2[j]) {
				i++;
			} else {
				System.out.println(arr1[i]);
				i++;
				j++;
			}
		}

	}

	// 通过TreeSet生成有序不重复的数组
	public static int[] getArr(int n) {
		int[] arr = new int[n];
		Set<Integer> set = new TreeSet<Integer>();
		while (set.size() < n) { // 生成特定长度的数组
			Random ran = new Random();// 生成随机数
			int num = ran.nextInt(10);
			set.add(num);
		}
		// 迭代输出数组
		Iterator<Integer> it = set.iterator();
		while (it.hasNext()) {
			System.out.print(it.next() + " ");
		}
		System.out.println();
		Integer[] temp = set.toArray(new Integer[] {});// 将TreeSet集合转换成数组
		for (int i = 0; i < temp.length; i++) {
			arr[i] = temp[i].intValue(); // 将Integer类型转换成int类型
		}
		return arr;
	}

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int m = in.nextInt();
		in.close();
		// int[] arr1 = { 0, 5, 8, 9};
		// int[] arr2 = { 0, 3, 4};
		int[] arr1 = new int[n];
		int[] arr2 = new int[m];
		arr1 = getArr(n);
		arr2 = getArr(m);
		fn1(arr1, arr2);
		fn2(arr1, arr2);
		fn3(arr1, arr2);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值