当前位置: 首页 > news >正文

算法练习题24——查找杨辉三角中的组合数

题目描述

杨辉三角中的每个元素是一个组合数。第 ( i ) 行的第 ( j ) 个元素表示组合数 ( C(i, j) ) ,即从 ( i ) 个元素中选 ( j ) 个元素的组合方式。已知一个正整数 ( N ),要求在杨辉三角中找到这个数,并输出它在杨辉三角中的具体位置。位置可以以第几行第几个元素的形式给出,或者将整个杨辉三角按顺序展开,输出 ( N ) 是展开后的第几个数。

输入

        一个整数 ( N ) 

输出

        输出整数 ( N ) 在杨辉三角中对应的位置,形式为:第几行的第几列,或者杨辉三角中的第几个元素。

解法一:逐项递推法

逐项递推法通过逐行计算杨辉三角中的所有组合数,直到找到目标数 ( N )。它直接从杨辉三角的第 0 行开始,依次计算每一行的组合数。

代码

import java.util.Scanner;public class FindInPascalTriangleByIteration {public static void main(String[] args) {// 读取输入的目标数 NScanner scanner = new Scanner(System.in);int N = scanner.nextInt();scanner.close();// 初始化位置计数,第0行第0列对应的位置为1int position = 1;// 遍历杨辉三角的每一行for (int i = 0; ; i++) {// 初始化当前行的第一个组合数C(i, 0) = 1long result = 1;// 遍历当前行的每一个元素 (即计算 C(i, j) 的值)for (int j = 0; j <= i; j++) {// 如果找到目标数N,则输出当前行和列的位置,并结束程序if (result == N) {System.out.println(i + " " + j);  // 输出行号i和列号jreturn;  // 结束程序}// 更新位置计数,表示组合数在杨辉三角中的顺序position++;// 计算下一个组合数C(i, j+1) 使用递推公式// result = C(i, j) = C(i, j-1) * (i - j) / (j + 1)if (j < i) {result = result * (i - j) / (j + 1);}}}}
}

解法二:二分查找法

二分查找法利用了组合数在每一行中先递增后递减的特性,可以对每一行中的组合数进行二分查找,快速定位目标数 ( N )。

代码

import java.util.Scanner;public class FindInPascalTriangleByBinarySearch {public static void main(String[] args) {// 读取输入的目标数 NScanner scanner = new Scanner(System.in);int N = scanner.nextInt();scanner.close();// 初始化位置计数int position = 1;  // 从第一元素开始计数// 遍历杨辉三角的行数for (int i = 0; ; i++) {// 如果这一行的中间最大值都比 N 小,则跳过这一行if (comb(i, i / 2) < N) {position += i + 1;  // 更新跳过的元素位置continue;}// 在这一行中使用二分查找来查找目标数 Nint left = 0;int right = i / 2;  // 只需要在行的左半部分查找while (left <= right) {int mid = left + (right - left) / 2;int value = comb(i, mid);  // 计算组合数 C(i, mid)if (value == N) {System.out.println(i + " " + mid);  // 输出行号 i 和列号 midreturn;  // 结束程序} else if (value < N) {left = mid + 1;  // 在右半部分继续查找} else {right = mid - 1;  // 在左半部分继续查找}}// 如果当前行没有找到目标数,更新位置计数position += i + 1;}}// 计算组合数 C(i, j)private static int comb(int i, int j) {long result = 1;for (int k = 0; k < j; k++) {result = result * (i - k) / (k + 1);  // 递推公式计算 C(i, j)}return (int) result;  // 返回组合数值}
}

总结

        逐项递推法适合处理较小的数据量,计算较为直观,但当杨辉三角行数较大时,效率较低。

        二分查找法利用组合数的单调性,显著提高查找效率,适合处理较大的数据范围。

这两种解法在不同场景下都可以使用,二分查找法尤其适合大规模数据下的查找问题。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 另类动态规划
  • dplyr、tidyverse和ggplot2初探
  • CX_SY_RANGE_OUT_OF_BOUNDS
  • 外包干了三年,快要废了。。。
  • jQuery UI API 文档
  • RISC-V交叉编译器下载
  • eureka服务开启之后的默认登录账号密码是什么?
  • 高德地图绘图,点标记,并计算中心点
  • Leetcode面试经典150题-141.环形链表
  • 官宣:Zilliz 在亚马逊云科技中国区正式开服!
  • EA橘子平台Origin离线安装包获取
  • 树莓派安装 OpenCV 教程
  • 腾讯云使用
  • 企业采用电子招投标的原因及系统推荐
  • 50ETF期权可以当天买卖吗?
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • golang中接口赋值与方法集
  • idea + plantuml 画流程图
  • input实现文字超出省略号功能
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Mocha测试初探
  • React-Native - 收藏集 - 掘金
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • vue学习系列(二)vue-cli
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 聊聊redis的数据结构的应用
  • 设计模式 开闭原则
  • 数据可视化之 Sankey 桑基图的实现
  • 通信类
  • 王永庆:技术创新改变教育未来
  • Hibernate主键生成策略及选择
  • 进程与线程(三)——进程/线程间通信
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $.ajax()
  • $nextTick的使用场景介绍
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (LeetCode 49)Anagrams
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (不用互三)AI绘画工具应该如何选择
  • (定时器/计数器)中断系统(详解与使用)
  • (独孤九剑)--文件系统
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (过滤器)Filter和(监听器)listener
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)winform之ListView