算法题——时间复杂度对比
程序员文章站
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);
}
}
上一篇: C++实现选择排序
推荐阅读
-
算法时间复杂度
-
算法题——时间复杂度对比
-
算法时间复杂度简介(一)
-
【算法】给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序
-
数据结构二分法-给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。
-
输入一个整型数组,输出该数组的主要元素,如果不存在主要元素,则输出-1,找出好的算法,需要考虑时间和控件复杂度;
-
【左神算法】给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。
-
实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。
-
冒泡排序的两种实现方法(Java) 博客分类: 算法与数据结构 冒泡排序时间复杂度空间复杂度
-
python算法与数据结构(算法的时间复杂度)