题目来源:牛客网
1. [编程题] 连续最大和
时间限制:1秒
空间限制:32768K
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
输入描述:
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:
所有连续子数组中和最大的值。
输入例子1:
3 -1 2 1
输出例子1:
3
思路:
- 维护一个长度为 n 的 num 数组,数组含义:以该元素为末尾的连续子集的最大和;
- 判断条件,如果 i-1 处的”最大和”加上num[i] 会使”最大和”有所增加,则更新”最大和”。
1 | import java.util.Scanner; |
2. [编程题]餐馆
某餐馆有n张桌子,每张桌子有一个参数:a 可容纳的最大人数; 有m批客人,每批客人有两个参数:b人数,c预计消费金额。 在不允许拼桌的情况下,请实现一个算法选择其中一部分客人,使得总预计消费金额最大
输入描述:
输入包括m+2行。 第一行两个整数n(1 <= n <= 50000),m(1 <= m <= 50000) 第二行为n个参数a,即每个桌子可容纳的最大人数,以空格分隔,范围均在32位int范围内。 接下来m行,每行两个参数b,c。分别表示第i批客人的人数和预计消费金额,以空格分隔,范围均在32位int范围内。
输出描述:
输出一个整数,表示最大的总预计消费金额
示例1
输入
3 5 2 4 2 1 3 3 5 3 7 5 9 1 10
输出
20
思路关键点:
- 二维数组的 sort 方法(使用 Comparator);
- 有序数组的二分查找
1 | package org.written.program; |
3. 最大乘积
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
输入例子1:
3 4 1 2
输出例子1:
24
思路:听说用long就能解决,我这里用BigInteger算牛刀杀鸡了。
1 |
|
私下练习(蛮好的题目):
1. 试题一
自定义函数,实现求解任意整数的幂运算,例如2^9, 3^(-5).
最佳要求:时间复杂度log N.
2. 试题二
给定一个m位的正整数n,2≤m≤15,可以通过交换任意两个数位上数字的位置使其尽可能比原来数字大。求k次交换后,可以获得最大的数字。
注意:每次交换时,不能使第一个数位上的数字为0.
例如:输入1374,2 输出为7413,表示1374经过两次数位交换,可以获得的最大数字为7413。
3. 试题三
给定任意一维数组,如{1, 4, 3, 5, 9, 12, 11, 14, 17}。该数组可能是有序的,也可能是无序的。请写一个函数,求出将该数组变成有序数组时,最少需要重新排序的元素个数。例如{1, 4, 3, 5, 9, 12, 11, 14, 17},输出结果为:6,需要对{4, 3, 5, 9, 12, 11}重新排序。
最佳要求:时间复杂度O(N),空间复杂度O(1)。
1 | // 题目一 |
1 |
|
1 | // 题目三: |