数组:如何求数组中两个元素的最小值

问题描述:

给定一个数组,数组中含有重复元素,给出两个数n1和n2,求这两个数字在数组中所出现位置的最小距离

例如: 数组 { 4, 5, 6, 4, 7, 4,  6, 4, 7, 8, 5, 6, 4, 3, 10, 8}, 4和8的最小距离为2.

实现思路:

遍历数组,会遇到两种情况:

1)当遇到n1时,记录下n1值对应的数组下标的位置n1_index,  通过求n1_index与上次遍历到n2的下标值n2_index的差,可以求出最近一次遍历到的n1与n2的距离

2)当遇到n2时,记录下n2值对应的数组下标的位置n2_index,  通过求n2_index与上次遍历到n1的下标值n1_index的差,可以求出最近一次遍历到的n1与n2的距离

变量 min_dist 记录n1与n2的最小距离,每次求出n1与n2的距离后与min_dist相比,求最小值。时间复杂度为O(n)

实现代码:

private int minDistance(int[] a, int n1, int n2) {
		if (a == null)
			return Integer.MIN_VALUE;
		int len = a.length;
		int n1_index = -1;
		int n2_index = -2;
		int min_dist = Integer.MIN_VALUE+1;//最小距离
		for(int i=0; i<len; i++){
			if(a[i] == n1){
				n1_index = i;
				if(n2_index >= 0){
//					min_dist的值应是min_dist与n1_index与n2_index距离的最小值
					min_dist = Math.min(Math.abs(min_dist), Math.abs(n1_index-n2_index));
				}
			}//
			if(a[i] == n2){
				n2_index = i;
				if(n1_index >= 0){
					min_dist = Math.min(Math.abs(min_dist),Math.abs(n2_index - n1_index));
				}
			}//
		}
		return min_dist;
	}

测试代码:

@Test
	public void main(){
		int a[] = {4,5,6,4,7,4,6,4,7,8,5,6,4,3,10,8};
		System.out.println(minDistance(a,4,8));
	}

效果截图:

猜你喜欢

转载自blog.csdn.net/weixin_38108266/article/details/81835749
今日推荐