KamaCoder(二)

本文探讨了三个编程题目,包括大鱼吃小鱼的数组操作,填充并输出递增的二维数组,以及使用动态规划求网格路径和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源于:卡码网KamaCoder

题解来源于:GitHub - youngyangyang04/kamacoder-solutions: 卡码网题解全集 

34.大鱼吃小鱼

题目描述

现在有 N 条鱼,每条鱼的体积为 Ai,从左到右排成一排。

A 数组是一个排列。 定义一次大鱼吃小鱼的操作为:对于每一条鱼,它在每一次操作时都会吃掉右边比自己小的一条鱼,值得注意的是,在同一次操作中,每条鱼吃掉比自己小的鱼是同时发生的。 

举例:假设有三条鱼,体积分别为 [5, 4, 3],在一次操作中,4 吃 3,5 吃 4,最终只剩下 [5] 一条鱼。 问题是,在多少次操作之后,鱼的数量就不会变了。

输入

输入共有两行。
第一行为一个整数 N。
第二行为一个数组,代表鱼的体积。

输出

输出一个非负整数,表示在多少次操作后鱼的数量就不会变了。

样例输入 
6
4 3 2 3 2 1
样例输出 
2
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author light
 * @Description 大鱼吃小鱼
 *
 *
 * (思路:
 * 判断该数组是否是递增数组,如果不是递增数组,则代表发生一次大鱼吃小鱼操作
 * 从后向前遍历数组,当前一个数值大于当前数值时,将数值删掉,直到数组递增数组为止

 * @create 2023-08-24 10:00
 */
public class Main {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		List<Integer> list=new ArrayList<>(); //利用list,方便元素删除操作
		for (int i = 0; i <n; i++) {
			list.add(input.nextInt());
		}
		int count=0; //记录大鱼吃小鱼的操作数
		while(!isIncrease(list)){
			for(int i=list.size()-1;i>0;i--){
				if(list.get(i)<list.get(i-1)){
					list.remove(i);

				}
			}
			count++;
		}
		System.out.println(count);
	}

	//判断是否为递增的
	private static boolean isIncrease(List<Integer> list) {
		for (int i =1; i < list.size(); i++) {
			if(list.get(i)<list.get(i-1)){
				return false;
			}
		}
		return true;
	}
}

 35. 打印二维数组

题目描述

给定一个空的二维整型数组 array[n][m],根据下图的填充规则填充该二维数组。

输入

输入包括两个正整数n,m,代表二维整型数组的大小。

输出

按行输出二维整型数组,每个数字后面都有一个空格。

样例输入 复制
4 4
样例输出 复制
1 2 4 7 
3 5 8 11 
6 9 12 14 
10 13 15 16 

 

import java.util.Scanner;

/**
 * @author light
 * @Description 打印二维数组
 *
 * 给定一个空的二维整型数组 array[n][m],根据下图的填充规则填充该二维数组。
 * @create 2023-08-24 10:03
 */
public class n6 {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		int m=input.nextInt();
		int[][] nums=new int[n][m];
		int count=1;
		//从左到右遍历
		for (int i = 0; i <m-1; i++) {
			int x=0;
			int y=i;
			while(x!=n&&y!=-1){
				nums[x][y]=count++;
				x++;
				y--;
			}
		}

		//从上到下
		for (int i = 0; i <n ; i++) {
			int x=i;
			int y=m-1;
			while(y!=-1&&x!=n){
				nums[x][y]=count++;
				x++;
				y--;
			}
		}

		for (int k = 0; k < n; k++) {
			for (int l = 0; l < m; l++) {
				System.out.print(nums[k][l]+" ");
			}
			System.out.println();
		}
	}
}

36. 网格路径和

题目描述

现有一个 m * n的网格,每个网格上都有一个非零整数,每次只能向下或者向右移动一格,计算从左上开始移动到右下的所有路径上数字的最大和。

输入

输入为一行,代表一个二维数组。

输出

输出一个整数,代表路径上的数字最大和。

样例输入 复制
[[2,3,1],[2,5,3],[4,2,1]]
样例输出 复制
14


import java.util.Scanner;

/**
 * @author light
 * @Description 网格路径和
 *
 *
 * (思路:动规
 * @create 2023-08-24 10:04
 */
public class Main {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		String arrayString = input.next();
		int[][] grid = parse2dArray(arrayString);

		System.out.println(getMaxValue(grid));

	}

	private static int getMaxValue(int[][] grid) {
		int m=grid.length; //行
		int n=grid[0].length;  //列
		int[][] dp=new int[m][n];  //dp[i][j]代表了从左上角到达格子(i, j)位置的最大路径和。
		//初始化dp[0][0]
		dp[0][0]=grid[0][0];
		//初始化第0列
		for (int i = 1; i < m; i++) {
			dp[i][0]=dp[i-1][0]+grid[i][0];
		}
		//初始化第0行
		for (int i = 1; i < n; i++) {
			dp[0][i]=dp[0][i-1]+grid[0][i];
		}
		for (int i = 1; i < m; i++) {
			for (int j = 1; j < n; j++) {
				dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1])+grid[i][j];
			}
		}
		return dp[m-1][n-1];
	}

	// 将字符串解析为二维数组
	private static int[][] parse2dArray(String arrayString) {
		String[] rowsString=arrayString.substring(1,arrayString.length()-2).split("],");
		// "[[1,2,3],[2,3,4],[3,4,5]]" -> "[1,2,3", "[2,3,4", "[3,4,5"
		int rows=rowsString.length; //行
		int cols=rowsString[0].split(",").length; //列
		int[][] digital2dArray = new int[rows][cols];
		for (int i = 0; i < rows; i++) {

			String[] element=rowsString[i].substring(1).split(",");
			//"[1,2,3"->1 2 3
			//"[2,3,4"->2 3 4
			//"[3,4,5"->3 4 5
			for (int j = 0; j < cols; j++) {
				digital2dArray[i][j]=Integer.parseInt(element[j]);
			}

		}

		return digital2dArray;
	}
}

 

### 关于 KamaCoder 网站的功能与特点 KamaCoder一个专注于 ACM 模式练习的学习平台,旨在帮助编程爱好者提升算法能力和熟悉常见数据结构的操作[^1]。该网站由知名算法博主代码随想录创建,提供了一系列精选的 25 道题目,这些题目覆盖了多种核心知识点,包括但不限于数组、链表、树、图等基础数据结构以及动态规划、贪心算法等多种经典算法。 #### 功能概述 - **多语言支持**:KamaCoder 提供 C++、Java、Python 和 C 四种主流编程语言的支持,允许用户自由选择熟悉的开发环境来解决问题。 - **在线评测系统**:用户可以提交自己的解决方案,并获得即时反馈,查看运行时间、内存消耗以及其他性能指标的结果分析。 - **社区互动**:除了个人练习外,还可以浏览其他用户的解答思路及其优化建议,从而促进交流学习氛围。 此外,未来计划中的卡码笔记将进一步扩展其教育价值,成为代码随想录知识星球内的一个重要组成部分。它不仅能够满足基本技能训练需求,还将引导学员深入参与到实际项目的建设过程中去——即打造属于他们自己的个性化学习间,在那里完成技术文档整理和技术面试准备等工作的同时也增强了动手实践的能力[^2]。 对于希望提高自己编码技巧或者备战各类程序设计竞赛的朋友来说,这无疑是一个非常值得尝试的好地方! ```python # 示例代码展示如何利用并查集解决路径查找问题 class UnionFind: def __init__(self, n): self.parent = list(range(n)) def find(self, u): if self.parent[u]!=u: self.parent[u]=self.find(self.parent[u]) return self.parent[u] def join(self,u,v): pu,pv=self.find(u),self.find(v) if pu==pv:return False self.parent[pu]=pv return True def isSame(self,u,v): return self.find(u)==self.find(v) uf=UnionFind(10) # 初始化大小为10的并查集实例 print(uf.join(1,2)) # 将节点1和2连接起来 print(uf.isSame(1,2)) # 判断节点1和2是否在同一集合中 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值