1.设计一个算法,找出数组中最小的k个数,并从小到大排序后输出。
思路:插入排序后新建数组存入前k个元素后返回。
class Solution {
public int[] smallestK(int[] arr, int k) {
int j;
for(int i=1;i<arr.length;i++){
int e=arr[i];
for(j=i;j>0&&arr[j-1]>e;j--){
arr[j]=arr[j-1];
}
arr[j] = e;
}
int[] result = new int[k];
for(int i=0;i<k;i++){
result[i]=arr[i];
}
return result;
}
}
思路:遍历数组找到则累计。
class Solution {
public int countNegatives(int[][] grid) {
int count = 0;
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]<0){
count++;
}
}
}
return count;
}
}
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。
思路:设置一个指针如果找到直接返回索引。如果没找到,创建一个新数组长度比原来多1,先把所求数字存到末尾,把原来的数按顺序存入,遍历此数组,如果发现所找数字小于当前数字,直接返回当前角标,如果没找到,直接返回新数组的长度。
class Solution {
public int searchInsert(int[] nums, int target) {
int pointer=0;
while(pointer<nums.length){
if(nums [pointer] != target){
pointer++;
}else{
return pointer;
}
}
int[] arr = new int[nums.length+1];
arr[nums.length] = target;
for(int i=0;i<arr.length-1;i++){
arr[i]=nums[i];
if(target<arr[i])
return i;
}
return nums.length;
}
}
给定 n
个整数,找出平均数最大且长度为 k
的连续子数组,并输出该最大平均数。
思路:i表示当前字串开始位置,j遍历当前字串,求和,然后算平均数,将每次的平均数进行比较,取最大的返回。
class Solution {
public double findMaxAverage(int[] nums, int k) {
double temp=0;
if(nums.length==1){
return nums[0];
}
for(int i=0;i<=nums.length-k;i++){//每次开始的地方
double aver =0;//每次循环开始初值为0
int sum = 0;
for(int j=i;j<=i+k-1 ;j++){//遍历i~i+k-1
sum+=nums[j];//求和
}
aver+=sum*1.0/k;//平均
temp = aver;//暂存
if(aver>temp){
temp = aver;
}
}
return temp;
}
}