百度的一道算法题

这篇博客介绍了百度的一道算法题目,涉及乘法表游戏。题目要求在nm的乘法表中找出第k个不减顺序排列的元素。常规的排序方法会导致超时和空间不足,博主分享了使用二分法来解决这个问题的思路,意识到自己在算法方面仍有提升空间。
摘要由CSDN通过智能技术生成

问题描述

度度熊和爷爷在玩一个乘法表游戏。乘法表的第i行第j列位置的元素为ij,并且乘法表下标编号从1开始,比如2 × 3乘法表为
1 2 3
2 4 6
爷爷十分聪明,对于n
m的乘法表,只要度度熊给出一个数k,爷爷就能立刻告诉度度熊乘法表中元素按照不减顺序排列之后,第k个元素是多少。你能重复这个游戏吗?

解题思路

首先,平常的思路是,排序,输出第k个元素。
但是这道题那样做就会超时,且空间也会不够用。
正解是,二分法

import java.util.Scanner;
public class Main{
	public static void main(String[] args){
		// 输入
		Scanner in = new Scanner(System.in);
        long n = in.nextLong();
        long m = in.nextLong();
        long k = in.nextLong();
        // 左计数器
        long l = 0;
        // 右计数器
        long r = n*m;
        // 中间计数器
        long mid;
        // 二分法
        while(l<=r){
        	// 计算出中间计数器
      	  	mid = (l+r)/2;
      	  	// 如果左边集合元素个数小于k, 
      	  	// 因为是不减序列,第k个值一定在右边序列
      	  	if(sum(mid,n,m)<k){
      	  		l=mid+1;
      	  	}else{
      	  		r=mid-1;
      	  	}
        }
        System.out.println(l);
	}
	
	
static long sum(long c , long n,  long m){
      	long sum = 0;
      	// 妙!!
        for (int i=1;i<=n;i++){
        	sum+=(c>=m*i)?m:c/i;
        }
        return sum;
      }
}

这是第一次接触,发现真的,不容易。
自己在算法这一块还是有很大的漏洞,有差距啊!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值