算法数组
Posted danfengw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法数组相关的知识,希望对你有一定的参考价值。
两数之和
1 两数相加=指定的数据,题目要求如下:
题目链接:
//给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
//
// 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
//
//
//
// 示例:
//
// 给定 nums = [2, 7, 11, 15], target = 9
//
//因为 nums[0] + nums[1] = 2 + 7 = 9
//所以返回 [0, 1]
//
// Related Topics 数组 哈希表
// 👍 9889 👎 0
解决方案:
1 暴力解决方案:2层for循环
2 借助HashMap利用 target=nums[0] + nums[1]
public int[] twoSum(int[] nums, int target)
HashMap<Integer, Integer> map = new HashMap<>();
int[] index = new int[2];
for (int i = 0; i < nums.length; i++)
map.put(nums[i], i);
for (int i = 0; i < nums.length; i++)
int targetData = target - nums[i];
if (map.containsKey(targetData) && map.get(targetData) != i)
index[0] = i;
index[1] = map.get(targetData);
break;
return index;
年龄排序
针对剑指offer中P81提到的场景,假如需要对公司内部几万个员工的年龄进行排序,要求时间复杂度为O(n),空间复杂度为O(1)。
主要思想:计数排序和前面的基排序类似,都是基于桶排序思想。由于这里要求时间复杂度为O(n),低于基于比较的时间复杂度O(nlogn),所以前面7中排序算法均失效。又因为该场景中年龄属于一个比较小的范围,有大量的重复值,故可以考虑计数排序。实际做法是,新开一个长度为100的数组(假设年龄为0~99),数组下标表示年龄,数组存储该下标对应的年龄出现的个数,最后再根据数组的计数来排序。
public static void ageSort(int[] ages, int num)
int oldestAge = 99;
int[] bucket = new int[oldestAge + 1];
// 初始化:将所有年龄的个数置0
for (int i = 0; i < bucket.length; i++)
bucket[i] = 0;
// 遍历输入的年龄:并记录年龄个数
for (int i = 0; i < num; i++)
if (ages[i]<0||ages[i]>oldestAge)
return;
bucket[ages[i]]+=1;
// 对原数组重新赋值
int index=0;
for (int i=0;i<bucket.length;i++)
int count=bucket[i];
for (int j=0;j<count;j++)
ages[index]=i;
System.out.print(" "+ i);
index++;
以上是关于算法数组的主要内容,如果未能解决你的问题,请参考以下文章