29. 最小的K个数
描述
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
- 0 <= k <= input.length <= 10000
- 0 <= input[i] <= 10000
示例
输入:[4,5,1,6,2,7,3,8],4
返回值:[1,2,3,4]
说明:返回最小的4个数即可,返回[1,3,2,4]也可以
分析
将数组升序排序,然后输出前参数个元素
import java.util.ArrayList;
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list = new ArrayList<>();
sort(input);
for (int i=0; i<k; i++)
list.add(input[i]);
return list;
}
public void sort(int[] array)
{
int t = 0;
for(int i=0; i<array.length; i++)
{
for(int j=i+1; j<array.length; j++)
{
if (array[i] > array[j])
{
t = array[i];
array[i] = array[j];
array[j] = t;
}
}
}
}
}
30. 连续子数组的最大和
描述
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).
示例
输入:[1,-2,3,10,-4,7,2,-5]
返回值:18
说明:输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。
分析
换一种思路:不遍历数组,而是用tmp变量不断考虑前面连续元素的加和为正或是为负而对最后结果的贡献。
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
int ret = array[0];
int tmp = 0;
for(int i = 0 ;i<array.length;i++)
{
tmp = tmp + array[i];
// ret = ret > tmp ? ret : tmp;
// if(tmp < 0)//前面的连续数组小于0,不会做贡献,舍去
// tmp = 0;
if (ret <= tmp)
ret = tmp;
// 注意此处为什么不是if (ret > tmp) 因为就算ret>tmp但是tmp还
// 是对这个数组有增长的贡献作用,只有tmp<0的时候才把tmp清零
if (tmp < 0)
tmp = 0;
}
return ret;
}
}
31. 整数中1出现的次数(从1到n整数中1出现的次数)
描述
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数
例如,1~13中包含1的数字有1、10、11、12、13因此共出现6次
示例
输入:13 返回值:6
分析
遍历数组,注意新建局部变量加快运行速度
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int cnt = 0;
for (int i=1; i<n+1; i++)
{
//加上下一行加快运行速度。
int k = i;
while(k > 0)
{
if(k%10 == 1)
cnt++;
k = k/10;
}
}
return cnt;
}
}