算法训练 4-1打印下述图形

本文介绍了一个C语言程序,该程序能够根据用户输入的行数n,打印出特定的图形。图形由星号(*)组成,每行星号的数量遵循一定的规律。
问题描述
  使用循环结构打印下述图形,打印行数n由用户输入。打印空格时使用"%s"格式,向printf函数传递只包含一个或多个空格的字符串" ",下同。
样例输入
一个满足题目要求的输入范例。
例:

5
样例输出
与上面的样例输入对应的输出。
例:
数据规模和约定
  输入数据中每一个数的范围。
  例:0<n<20。
 
#include<stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	int i,j,k;
	for(i=0;i<n;i++){
		for(j=0;j<n-i-1;j++){
			printf(" ");
		}
		for(k=0;k<2*i+1;k++){
			printf("*");
		}
		for(j=0;j<n-i-1;j++){
			printf(" ");
		}
		printf("\n");
	}
	return 0;
}

由于给定引用中未提及“find - second - min”算法的相关内容,下面基于通用知识对该算法进行介绍。 “find - second - min”算法的目标是在给定的数据集合中找出第二小的元素。以下是几种常见的实现方式: ### 简单遍历法 这种方法的基本思路是遍历整个数据集,同时记录最小元素和第二小元素。 ```python def find_second_min(arr): if len(arr) < 2: return None # 初始化最小元素和第二小元素为无穷大 first_min = float('inf') second_min = float('inf') for num in arr: if num < first_min: second_min = first_min first_min = num elif num < second_min and num != first_min: second_min = num return second_min if second_min != float('inf') else None arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] print(find_second_min(arr)) ``` 该算法的时间复杂度为 $O(n)$,因为只需要对数据集进行一次遍历。 ### 排序法 先对数据集进行排序,然后取排序后数组的第二个元素作为第二小元素。 ```python def find_second_min_sort(arr): if len(arr) < 2: return None sorted_arr = sorted(set(arr)) return sorted_arr[1] if len(sorted_arr) > 1 else None arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] print(find_second_min_sort(arr)) ``` 这种方法的时间复杂度主要取决于排序算法,通常为 $O(n log n)$。 ### 堆排序法 可以使用最小堆来实现,先将所有元素加入堆中,然后依次弹出堆顶元素,第二次弹出的元素即为第二小元素。 ```python import heapq def find_second_min_heap(arr): if len(arr) < 2: return None unique_arr = list(set(arr)) if len(unique_arr) < 2: return None heapq.heapify(unique_arr) heapq.heappop(unique_arr) return heapq.heappop(unique_arr) arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] print(find_second_min_heap(arr)) ``` 构建堆的时间复杂度为 $O(n)$,每次弹出堆顶元素的时间复杂度为 $O(log n)$,整体时间复杂度接近 $O(n + log n)$。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值