首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >每日一题来噜!(记负均正,旋转数组中的最小数字)

每日一题来噜!(记负均正,旋转数组中的最小数字)

作者头像
用户11039545
发布2024-03-28 17:33:13
发布2024-03-28 17:33:13
1730
举报
文章被收录于专栏:c语言c语言
代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int n = 0;
	int arr[1000] = { 0 };
	int sum = 0;
	int count = 0;
	int count2 = 0;
	printf("请输入你要输入的整数个数\n");
	// 检查数组越界  
	scanf("%d", &n);
	if (n > 1000) {
		printf("输入的整数个数过多,最多只能输入1000个整数。\n");
		return 1; // 返回一个非零值表示出错  
	}
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &arr[i]);
			if (arr[i] < 0) {
				count++;
			}
			else if (arr[i] > 0) {
				count2++;
				sum += arr[i];
			}
		}
		// 检查是否有正数输入以避免除零错误  
		if (count2 == 0) {
			printf("没有输入正数,无法计算平均值。\n");
			return 1; // 返回一个非零值表示出错  
		}
		printf("%d %d", count, sum / count2);
		return 0;
	}
代码语言:javascript
复制
int minNumberInRotateArray(int* nums, int size ) {
    int l = 0, r = size - 1;//定义左指针l指向数组的起始位置,右指针r指向数组的末尾位置
    while (l < r && nums[r] == nums[0]) 
        r--;//如果数组的末尾元素与起始元素相同,则可能有多个旋转点。因此,我们不断地将右指针向左移动,直到它指向一个与起始元素不同的值,或者左指针与右指针相遇
    if (nums[l] <= nums[r]) 
        return nums[0];//如果经过上述步骤后,左指针的值仍然小于或等于右指针的值,这意味着整个数组可能是已经排序的(没有旋转),或者只有一个旋转点且该点的值与起始值相同。在这种情况下,我们只需返回起始元素
    while (l < r) {
        int mid = (l + r)/2;//使用二分查找策略在数组中找到旋转点。每次取数组的中点mid,并检查该点的值是否小于起始元素。
//如果nums[mid] < nums[0],这意味着mid在旋转点的右侧,因此我们将右指针移动到mid。

//否则,mid在旋转点的左侧或就是旋转点本身,我们将左指针移动到mid + 1
        if (nums[mid] < nums[0]) 
            r = mid;
        else 
            l = mid + 1;
    }
    return nums[r];
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档