LeetCode141周赛

本文介绍了LeetCode141周赛中的两道题。1090题是求受标签影响的子集最大和,思路是用HashMap和优先级队列;1091题是求二进制矩阵中从左上角到右下角的最短畅通路径长度,思路是使用BFS算法。

LeetCode141周赛


1090. 受标签影响的最大值

我们有一个项的集合,其中第 i 项的值为 values[i],标签为 labels[i]

我们从这些项中选出一个子集 S,这样一来:

  • |S| <= num_wanted
  • 对于任意的标签 L,子集 S 中标签为 L 的项的数目总满足 <= use_limit

返回子集 S 的最大可能的 

示例 1:

输入:values = [5,4,3,2,1], labels = [1,1,2,2,3], num_wanted = 3, use_limit = 1
输出:9
解释:选出的子集是第一项,第三项和第五项。

示例 2:

输入:values = [5,4,3,2,1], labels = [1,3,3,3,2], num_wanted = 3, use_limit = 2
输出:12
解释:选出的子集是第一项,第二项和第三项。

示例 3:

输入:values = [9,8,8,7,6], labels = [0,0,0,1,1], num_wanted = 3, use_limit = 1
输出:16
解释:选出的子集是第一项和第四项。

示例 4:

输入:values = [9,8,8,7,6], labels = [0,0,0,1,1], num_wanted = 3, use_limit = 2
输出:24
解释:选出的子集是第一项,第二项和第四项。

思路:HashMap+优先级队列(排序也行)

public int largestValsFromLabels(int[] values, int[] labels, int num_wanted, int use_limit) {
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    PriorityQueue<SimpleEntry<Integer, Integer>> priorityQueue = 
            new PriorityQueue<SimpleEntry<Integer,Integer>>(new Comparator<SimpleEntry<Integer, Integer>>() {
                @Override
                public int compare(SimpleEntry<Integer, Integer> o1, SimpleEntry<Integer, Integer> o2) {
                    // TODO Auto-generated method stub
                    if(o1.getValue() == o2.getValue())
                        return o1.getKey() - o2.getKey();
                    return o2.getValue() - o1.getValue();
                }
            });
    for(int i = 0;i < values.length;i++) {
        SimpleEntry<Integer, Integer> entry = new SimpleEntry<Integer, Integer>(labels[i],values[i]);
        priorityQueue.add(entry);			
    }
    int cnt = 0,res = 0;
    while(!priorityQueue.isEmpty() && cnt < num_wanted) {
        SimpleEntry<Integer, Integer> entry = priorityQueue.poll();
        Integer integer = map.getOrDefault(entry.getKey(),new Integer(0));
        if(integer < use_limit) {
            res += entry.getValue();
            cnt++;
            integer++;
            map.put(entry.getKey(), integer);
        }else {
            continue;
        }			
    }        
    return res;
}

 

 

 

 

1091. 二进制矩阵中的最短路径

https://leetcode-cn.com/problems/shortest-path-in-binary-matrix/solution/java-bfs-by-ftcl_lx/

在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。

一条从左上角到右下角、长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, ..., C_k 组成:

  • 相邻单元格 C_i 和 C_{i+1} 在八个方向之一上连通(此时,C_i 和 C_{i+1} 不同且共享边或角)
  • C_1 位于 (0, 0)(即,值为 grid[0][0]
  • C_k 位于 (N-1, N-1)(即,值为 grid[N-1][N-1]
  • 如果 C_i 位于 (r, c),则 grid[r][c] 为空(即,grid[r][c] == 0

返回这条从左上角到右下角的最短畅通路径的长度。如果不存在这样的路径,返回 -1 。

思路:BFS

final int INF = 1000000000;
int[] dx = {-1, -1, -1, 0, 0, 1, 1, 1};
int[] dy = {-1, 0, 1, -1, 1, -1, 0, 1};	
class Pair{
	int x;
	int y;
	public Pair(int x,int y) {
		this.x = x;
		this.y = y;
	}
}
public int shortestPathBinaryMatrix(int[][] grid) {
    int n = grid.length;
	if(grid[0][0] == 1 || grid[n-1][n-1] == 1) return -1;
	int[][] dis = new int[n][n];
	for(int i = 0;i < n;i++)
		Arrays.fill(dis[i], INF);
	Queue<Pair> queue = new LinkedList<>();
	dis[0][0] = 0;
	queue.add(new Pair(0, 0));
	while(!queue.isEmpty()) {
		int x = queue.peek().x;
		int y = queue.peek().y;
		queue.poll();
		for(int i = 0;i < 8;i++) {
			int tx = x + dx[i];
			int ty = y + dy[i];
			if(tx >= 0 && tx < n && ty >= 0 && ty < n && grid[tx][ty] == 0 && dis[tx][ty] > dis[x][y] + 1) {
				dis[tx][ty] = dis[x][y] + 1;
				queue.add(new Pair(tx, ty));
			}											
		}						
	}
	if(dis[n-1][n-1] == INF) return -1;
	return dis[n-1][n-1] + 1;
}

 

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值