找出数组中的主元素

问题:在一个规模为N的数组A[N]中,所谓主元素就是出现次数大于N/2的元素,例如 3.3.4.2.4.4.2.4.4  有一个主元素为4。

          给出一个算法,如果过半元素存在,就找出来,否则给出报告,要求给出O(N)的算法。

解答:1.如果确定数组中存在主元素,则有两种解法。

一是用递归,遍历数组,第1步,如果元素的个数是1,算法退出,第2步,元素两两比较,如果两个数相同,则删去一个,如果两个数不同,则都删去,第3步,重复执行第1步。复杂度segma=n+n/2+n/4+...=O(2n)。

二是充分利用已知条件出现次数大于N/2。首先假设主元素是X,则遍历数组时出现与X相等的元素时,X出现的数目+1,不相等时,如果计数值变为1,则这个X可能不是主元素,需要将假定值更改为新出现的元素,计数值不为1时,则X出现的数目-1.遍历完后的X就是主元素。复杂度为O(n),其代码如下:

int get(int A[], int n) {
	int result, cnt;
	result = A[0]; cnt = 1;
	for(int i=1; i<n; i++) {
		if(A[i] == result) {
			cnt++;
		}
		else if(cnt == 1) {
			result = A[i]; 
			cnt = 1;
		} else {
			cnt--;
		}
	}
	return result;
}

2.如果不确定是否存在主元素。

可以将1中的解法二稍作修改,无论是否存在主元素,遍历完后的X一定是主元素的候选元,因此再次遍历数组,判断X出现的次数是否大于N/2即可。代码如下:

int get(int A[], int n) {
	int result, cnt;
	result = A[0]; cnt = 1;
	for(int i=1; i<n; i++) {
		if(A[i] == result) {
			cnt++;
		}
		else if(cnt == 1) {
			result = A[i]; 
			cnt = 1;
		} else {
			cnt--;
		}
	}
	cnt=0;
	for(int i=0;i<n;i++){
		if(A[i]==result)
			cnt++;
	}
	if(cnt>(n/2))
		return result;
	else
		return -65535;
}

还可参考此解法:http://blog.csdn.net/endual/article/details/7233222

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用Python语言中的内置函数`min()`来找出数组中的最小值,然后使用`index()`方法来获取此最小值在数组中的下标。 ```python def find_min_and_index(arr): min_value = min(arr) # 找出数组中的最小值 min_index = arr.index(min_value) # 获取最小值在数组中的下标 return min_value, min_index # 测试代码 arr = [5, 2, 9, 3, 7, 1] min_value, min_index = find_min_and_index(arr) print("最小值为:", min_value) print("最小值的下标为:", min_index) ``` 以上代码中,`find_min_and_index()`函数接受一个数组作为参数,使用`min()`函数找出数组中的最小值,然后使用`index()`方法获取最小值在数组中的下标。最后返回最小值和下标。 对于给定的数组`arr = [5, 2, 9, 3, 7, 1]`,输出结果为: ``` 最小值为: 1 最小值的下标为: 5 ``` 这样就得到了数组中的最小值和其对应的下标。 ### 回答2: 在Python中,可以使用内置函数`min()`来找出数组中的最小值。同时,可以使用内置方法`index()`来找出最小值在数组中的下标。下面是一个例子: ```python arr = [5, 3, 2, 7, 9, 1, 4] min_value = min(arr) # 使用min()找到最小值 min_index = arr.index(min_value) # 使用index()找到最小值在数组中的下标 print("数组中的最小值为:", min_value) print("最小值的下标为:", min_index) ``` 上述代码输出的结果为: ``` 数组中的最小值为: 1 最小值的下标为: 5 ``` 在这个例子中,数组`arr`中的最小值是1,它的下标是5。 ### 回答3: Python可以使用以下代码来找出数组中的最小值和其下标: ```python def find_min(arr): min_value = float('inf') # 将最小值设为无穷大 min_index = 0 # 将最小值的下标设为0 for i in range(len(arr)): if arr[i] < min_value: # 如果当前元素小于最小值 min_value = arr[i] # 更新最小值 min_index = i # 更新最小值的下标 return min_value, min_index arr = [5, 2, 8, 1, 9] min_val, min_idx = find_min(arr) print("最小值:", min_val) print("最小值的下标:", min_idx) ``` 以上代码定义了一个`find_min`函数,它接受一个数组作为参数,并返回最小值和最小值的下标。在函数内部,使用`float('inf')`将`min_value`初始化为无穷大,将`min_index`初始化为0。使用循环遍历数组,如果当前元素小于最小值,则更新`min_value`和`min_index`。最后,返回最小值和最小值的下标。 在主程序中,我们定义了一个数组`arr`,然后调用`find_min`函数来找出最小值和最小值的下标。最后,输出最小值和最小值的下标。对于输入的`arr`数组,输出的结果将会是最小值为1,最小值的下标为3。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值