import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CommonItemInTwoSortedArray {
/**
* 题目:给定两个已排序序列,找出共同的元素。
* 1.定义两个指针分别指向序列的开始。
* 如果指向的两个元素相等,则找到一个相同的元素;如果不等,则将指向较小元素的指针向前移动。
* 重复执行上面的步骤,直到有一个指针指向序列尾端。
* 2.如果数组大小差得很多,就遍历小的,然后在大的里二分查找
*/
public static void main(String[] args) {
int[] a={1,3,5,7};
int[] b={2,3,4,5,6,8};
List<Integer> c=findCommonItems(a,b);
for(int each:c){
System.out.print(each+" ");
}
}
public static List<Integer> findCommonItems(int[] a,int[] b){
List<Integer> commonList=new ArrayList<Integer>();
if(!(a!=null&&a.length>0&&b!=null&&b.length>0)){
return commonList;
}
int lenA=a.length;
int lenB=b.length;
/*
if(lenA<lenB){//how do we know lenB is much bigger than lenA? lenB>=100*lenA? or lenB>=1000*lenA?...
for(int each:a){
int index=Arrays.binarySearch(b,each);//we can write our own binarySearch for practice.
if(index>=0){
commonList.add(each);
}
}
return commonList;
}
*/
for(int i=0,j=0;i<lenA&&j<lenB;){
if(a[i]<b[j]){
i++;
}else if(a[i]==b[j]){
commonList.add(a[i]);
i++;
j++;
}else if(a[i]>b[j]){
j++;
}
}
return commonList;
}
}
分享到:
相关推荐
- 给定两个排序数组,找出它们的中位数。这是一个涉及到两个数组的合并和查找的问题。 19. FindMinimuminRotatedSortedArray - 在旋转排序数组中找到最小元素,要求算法的时间复杂度为O(log n)。这是对二分查找...
- 给定两个整数,找出它们中的最大值和最小值。 - 可以使用条件运算符“?”实现。 7. **字符统计**: - 统计一段英文文本中每个字符出现的次数。 - 使用循环结构读取文本,并利用HashMap存储每个字符的出现次数...
- 描述:找出给定字符串中的最长回文子串。 - 关键技术:中心扩展法,从每个可能的中心点向外扩展。 ### 栈和队列 栈和队列是两种常见的抽象数据类型,它们在算法设计中扮演重要角色。 #### 栈 栈是一种先进后出...
给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为O(n)。 例如: 输入:[100, 4, 200, 1, 3, 2] 输出:4 解释:最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 解决思路: 1. 使用哈希表...
它的基本思想是遍历数组,每次从未排序的部分找出最小(或最大)元素放到已排序序列的末尾。虽然其实现简单,但其时间复杂度较高,不适合大规模数据的排序。 ### 4. 冒泡排序 - **稳定性**:稳定 - **时间复杂度**...
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从序列的部分有序状况下,...
根据给定的文件信息,我们将深入探讨两个关键的IT领域知识点:动态规划在寻找最长单调递增子序列中的应用以及动态规划在图像压缩算法中的作用。 ### 一、动态规划与最长单调递增子序列 #### 知识点概述: **最长...
选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。这种排序方式就像我们在日常生活中挑选东西一样...
它的工作原理是每次从未排序的部分找出最小(或最大)的元素,存放到排序序列的起始位置。然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 ####...
其工作原理是:遍历待排序数组中的所有元素,每次从未排序的部分找出最小(或最大)的元素放到已排序序列的末尾,直到所有元素均被排序完毕。 - **第一步**:从数组的第一个元素开始,找到整个未排序部分的最小元素...
它的工作原理是每次从未排序的部分找出最小(或最大)的元素,存放到排序序列的起始位置,直到所有元素均排序完毕。 **实现:** ```java public class SelectionSort { public void sort(int[] values) { for ...
它的工作原理是每次从未排序的部分找出最小(或最大)的元素,存放到已排序序列的末尾。在给定的代码示例中,可以看到直接选择排序的基本实现过程: ```java public static void selectSort(DataWrap[] data) { int...
这里首先使用`split(",")`方法将字符串分割成数组,然后通过比较两个数组中对应位置的元素来找出不同之处。这种方法假设字符串是以逗号分隔的整数列表,并且两个字符串的长度可能不同,因此根据较短的字符串长度来...
- **插入排序**:将元素视为已排序序列和未排序序列,每次从未排序序列中取出一个元素,插入到已排序序列的正确位置。代码中同样有两个嵌套`for`循环,外层循环遍历未排序部分,内层循环找到插入位置并进行插入。 ...
- **选择排序**:每次找出未排序部分的最大(或最小)元素放到已排序部分的末尾。 - **插入排序**:将未排序元素逐个插入到已排序部分的合适位置。 - **快速排序**:利用分治策略,选取基准元素进行划分,然后...
它的工作原理是在未排序序列中找到最小(或最大)元素放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。代码示例中展示了选择排序的核心步骤:每次从未...