数组是程序种最常见,最基本的数据结构
1、数组要灵活利用下标索引来快速访问到数组中指定的元素
2、数组的元素在内存中是连续存储的,每个元素占用的内存大小是一样的
这里通过练习leetcode的几道题目来加深对数组的学习
一 丶两数之和
这道题是 Leetcode 上的第(1)道题,给定一个数组和一个目标值,返回数组中两个元素之和为目标值的元素下标
1.1 暴力解法
即是使用遍历数组的方式,对所有的两数之和和目标值作比较,如相同则返回
public int[] fun1(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
int[] res = new int[2];
res[0] = i;
res[1] = j;
return res;
}
}
}
return null;
}
复杂度:
时间复杂度:O(n^2),因为使用两个for循环,当最差的情况时,需要经过 n(n-1) 次才能找到目标值
空间复杂度:O(1)
1.2 哈希表
遍历一次元素,将元素和目标值的差值,和哈希表中的key作比较,若存在于哈希表中,则返回,若不存在,则将元素插入到哈希表当中
public int[] fun2(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int temp = target - nums[i];
if (map.containsKey(temp)) {
return new int[]{i, map.get(temp)};
} else {
map.put(nums[i], i);
}
}
return null;
}
二丶三数之和
LeetCode上第(15)题
给定一个数组,找出三个元素之和为目标值0的所有组合
3.1 暴力法
暴力法循环三次后,得到一个集合,但是这个集合是没有去重的
public List<List<Integer>> fun1(int[] nums) {
int len = nums.length;
ArrayList<List<Integer>> list = new ArrayList<>();
for (int i = 0; i < len - 2; i++) {
for (int j = i + 1; j < len - 1; j++) {
for (int k = j + 1; k < len; k++) {
if (nums[i] + nums[j] + nums[k] == 0) {
list.add(Arrays.asList(nums[i], nums[j], nums[k]));
}
}
}
}
return list;
}