0 0

被一道JAVA算法题难住了,请各位帮忙看下。0

数组 C[I] = A[I] + B[I] / 1,000,000.
例如 A 和 B:
  A[0] = 0 B[0] = 500,000
  A[1] = 1 B[1] = 500,000
  A[2] = 2 B[2] = 0
  A[3] = 2      B[3] = 0
  A[4] = 3 B[4] = 0
  A[5] = 5 B[5] = 20,000
则 C:
  C[0] = 0.5
  C[1] = 1.5
  C[2] = 2.0
  C[3] = 2.0
  C[4] = 3.0
  C[5] = 5.02
寻找一对下标(P, Q) 满足 0 ≤ P < Q < N 且 C[P] * C[Q] ≥ C[P] + C[Q].
上面的数组中满足条件的有:
(1, 4),  1.5 * 3.0 = 4.5 ≥ 4.5 = 1.5 + 3.0,
(1, 5),  1.5 * 5.02 = 7.53 ≥ 6.52 = 1.5 + 5.02,
(2, 3),  2.0 * 2.0 = 4.0 ≥ 4.0 = 2.0 + 2.0,
(2, 4) and (3, 4),  2.0 * 3.0 = 6.0 ≥ 5.0 = 2.0 + 3.0.
(2, 5) and (3, 5),  2.0 * 5.02 = 10.04 ≥ 7.02 = 2.0 + 5.02.
(4, 5),  3.0 * 5.02 = 15.06 ≥ 8.02 = 3.0 + 5.02.
现要求写个方法:
class Solution { public int solution(int[] A, int[] B); }
给出数组 A and B, 分别包含N个非负整数, 返回满足条件的下标对个数.
如果满足条件的下标对超过 1,000,000,000, 则返回 1,000,000,000.
例如,给出:
  A[0] = 0 B[0] = 500,000
  A[1] = 1 B[1] = 500,000
  A[2] = 2 B[2] = 0
  A[3] = 2 B[3] = 0
  A[4] = 3 B[4] = 0
  A[5] = 5 B[5] = 20,000
此方法应返回 8.
假设:
N 是整数,取值范围 [0..100,000];
数组A中的元素取值范围 [0..1,000];
数组B中的元素取值范围 [0..999,999];
数组C中的元素为非递减.
复杂度要求:
最坏的情况下,时间复杂度 O(N);
最坏的情况下,空间复杂度 O(1), 不包括参数的存储空间.
2014年8月04日 06:28

2个答案 按时间排序 按投票排序

0 0

采纳的答案

分析如下:
从a*b>=a+b可以推到出:a*b>=4或者a*b=0同时必须满足a>1&b>1,这个可以通过数学方法得到.
由于a, b都是大于0的,所以我们可以依据以上规则对如上题目做这样一个优化:求一个数组(P[n]无序),找到该数组下所有的二元组合(a[i],a[j])其中0<=i<=j<n,满足条件a[i]*a[j]>=4或者a[i]*a[j]==0的所有组合列表,同时满足时间复杂度为O[n],空间复杂度为O[1].
如果如上推论是正确的话,那么后面就是算法的选择问题了。
1 通过数组A[i]和B[i]算出数组C[i]
2 排序C[i]数组,时间复杂度为O[n],如基数排序?
3 针对排序后的数据做如下操作,
3.1 找到这样一个下标i,使得C[i-1]<2,C[i]>=2,如这样一个数据[0,1.1,1.1,1.5,1.6,2,2.3,5,7,8,10],这样的好处就是,对于i以后的任何组合,你都可以确定他们满足C[i]*C[j]>=C[i]+C[j]。所以仅需要满足C[0]--C[i-1]到C[i]到C[n]的组合,满足条件C[i]*C[j]>=C[i]+C[j]。
3.2 分别定义连个小标i,j,使得i+1=j并且C[i]<2,C[j]>=2, 因为根据这样一个条件,如果C[i]*C[j]>=4,那么C[i]*C[k]>=4(k>j)肯定满足,同理如果C[i]*C[j]>=4不满足,那么C[k]*C[j]>=4(k<i)肯定也不满足.所以可以做一个循环分别计算C[0],C[i]之间各个参数满足条件的组合个数,计算出即可。

当然在3.2中你其实还是可以找到另外一个下标k使得C[k-1]<=1,C[k]>1,因为如果C[k]<=1,那么肯定不能满足这个组合条件了。

2014年8月05日 10:09
0 0

这个题中只要 C[P]和C[Q]都是大于1的数那么
C[P]*C[Q]就是始终大于C[P]+C[Q]
( 即C[P]>=1&&C[Q]>=1 就会出现C[P]*C[Q]>=(C[P]+C[Q]))

2014年8月04日 21:20

相关推荐

    java经典算法90题含源码及答案.rar

    Java经典算法90题含源码及答案的资源是一份非常宝贵的资料,它涵盖了大量用于提升Java编程技能和算法理解的题目。这份压缩包包含了三份文档:JAVA经典算法40题.doc、最新JAVA编程题全集_50题及答案.doc、50道JAVA...

    JAVA算法编程题汇总(50题及答案)

    Java 算法编程题汇总 Java 算法编程题汇总是本文的主题,本文将对 50 道 Java 算法编程题进行汇总,涵盖了 Fibonacci 序列、素数、水仙花数、质因数分解等多个方面的知识点。 Fibonacci 序列 Fibonacci 序列是...

    java常见算法题解析大全。

    在这个“java常见算法题解析大全”中,你将找到一系列涵盖不同难度级别的算法问题,旨在帮助Java开发者提升技能,增强解决问题的能力。 首先,让我们了解一下折半查找(Binary Search)算法。这是一种在有序数组中...

    JAVA算法编程题目及答案.doc

    JAVA算法编程题目及答案 本资源提供了50道JAVA算法编程题目及答案,涵盖了算法设计、数据结构、程序设计等多个方面的知识点。以下是对标题、描述、标签和部分内容的详细解释: 标题:JAVA算法编程题目及答案 本...

    JAVA算法编程题全集(50题及答案)

    JAVA算法编程题全集(50题及答案) 本资源提供了50道JAVA算法编程题,涵盖了基本数据结构、算法设计、面向对象编程等多方面内容,旨在检测JAVA语言的掌握情况。以下是对每道题目的知识点详细解释: 程序1:...

    JAVA经典算法40题.pdf

    JAVA经典算法40题.pdf 本资源是JAVA经典算法40题的PDF文件,该文件包含了40个经典算法题目,每个题目都有相应的Java代码实现。以下是对标题、描述、标签和部分内容的知识点解释: 标签:“数据库” 虽然标签是...

    java算法题(三)

    很不错的java算法题 很不错的java算法题 很不错的java算法题 很不错的java算法题 很不错的java算法题

    JAVA经典算法90题【含源码】

    "JAVA经典算法90题【含源码】"的资源集合为Java初学者提供了一个绝佳的学习平台,旨在通过实际操作来理解和应用各种基础及进阶算法。下面将详细阐述这些算法题目所涉及的知识点,并建议的学习路径。 首先,"JAVA...

    JAVA基础编程练习题50题及经典算法90题【含源码及答案】-史上最全

    Java基础编程练习题和经典算法是提升编程技能和准备面试的关键环节。这50题的基础编程练习涵盖了Java语言的核心概念,如数据类型、控制结构、类与对象、异常处理、集合框架等,旨在帮助学习者巩固基础知识并提高编程...

    java算法全卷(包括基本算法和图算法)

    Java算法全卷涵盖了基本算法和图算法,是学习和提升编程技能的重要资源。这份资料主要针对使用Java语言进行算法实现的开发者,适用于那些对ANT、EJB、J2EE、JAVA和SPRING等技术栈有了解或兴趣的人群。下面我们将深入...

    java经典程序题及算法含代码

    Java经典程序题及算法含代码 java经典程序题及算法含代码是一份涵盖了多种经典算法题的Java程序编程题集,旨在帮助Java开发者提高编程能力和算法思维能力。该资源包含了多个Java程序题,每个程序题都配备了详细的...

    Java算法刷题带注释Leetcode

    在编程领域,算法是解决问题的关键,对于Java开发者来说,熟悉并掌握各种算法是提升技能的重要途径。本资源“Java算法刷题带注释Leetcode”是针对LeetCode平台的Java解题集合,特别适合初学者和希望巩固算法基础的...

    JAVA经典算法90题【含源码】-史上最全

    "JAVA经典算法90题【含源码】-史上最全"这个压缩包文件提供了一个宝贵的资源,涵盖了90个Java实现的经典算法问题,旨在帮助开发者提升算法思维和编程技巧。 1. **排序算法**:包括快速排序、归并排序、插入排序、...

    JAVA绝对经典算法

    这个算法采用了一个简单的策略:从最小的质数2开始,尝试除尽目标数,直到不能再整除为止,然后继续下一个可能的质数,直至目标数完全被分解。这种方法虽然简单,但在处理大数时可能需要更复杂的优化策略。 以上四...

    JAVA近百种算法大全

    Java算法大全是一个包含约100种常见算法的资源库,专为Java程序员设计,用于深入理解和实践编程中的各种算法。这些算法涵盖了数据结构、排序、搜索、图论等多个领域,是提升编程技能和解决问题能力的重要工具。下面...

    java国密算法实现

    在SM2.java和SM3.java文件中,你应该能找到对应算法的具体实现,包括加密、解密、签名和验签的函数。 为了在Java项目中使用这些国密算法,你需要引入支持国密的库,如Bouncy Castle或Chinese Cryptography ...

    2016JAVA算法面试编程题全集(50题及答案)

    - 如果不可以,就检查下一个质数(即2+1=3),并重复上述过程,直到n等于1为止。 #### 程序5:成绩分级 - **成绩分级**:根据学生的分数将其划分为不同的等级,这在教育评估中很常见。 - **实现方式**: - 使用...

    Java常用算法手册

    《Java常用算法手册》分三篇,共13章,分别介绍了算法基础、算法应用和算法面试题。首先介绍了算法概述,然后重点分析了数据结构和基本算法思想;接着,详细讲解了算法在排序、查找、数学计算、数论、历史趣题、游戏...

    JAVA 经典算法书集合(1)

    JAVA 经典算法集合(1),JAVA 经典算法集合(1),JAVA 经典算法集合(1),JAVA 经典算法集合(1),JAVA 经典算法集合(1),JAVA 经典算法集合(1),JAVA 经典算法集合(1)JAVA 经典算法集合(1),JAVA 经典...

    几个推荐算法的java实现

    本项目提供了一些推荐算法的Java实现,包括slopeone、SVD(奇异值分解)以及基于物品邻接的SVD(ItemNeighborSVD)。下面我们将详细探讨这些算法及其在Java中的实现。 1. **slopeone**: - Slope One是一种简单的...

Global site tag (gtag.js) - Google Analytics