欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-16 15:43:04
...

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


题目两个含有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);
	}

}