🌟Leetcode exercise record🌟 0
🙊 TOP100 easy 1
Q&A
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
可以假设每种输入只会对应一个答案。但是不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
💭Language:C C++ Java
🍓🍓WAY1 C language 暴力解法
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
static int a[2]={0};
for (int i = 0;i < numsSize - 1; i++)
{
for(int j = i+1;j < numsSize; j++)
{
if(nums[i] + nums[j] == target)
{
a[0] = i;
a[1] = j;
return a;
}
}
}
return 0;
}
👉NOTE
1.return问题
gcc规定一个函数如果函数体中有循环,循环外部也要有return。如果你拿这段代码在vs上面跑就能通过。
2.static int a[]:
如果不用静态的话,数组的生命周期就是从定义的地方到函数结束,函数运行结束,这个内存也就释放掉了。返回的是数组的首地址,一旦函数运行结束,这个地址里的东西变为空,所以要用静态数组延长数组的生命周期。
如果不设置成静态,函数执行完就系统自动回收分配的内存。
🍓🍓WAY2 C language 暴力解法
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int* res = (int *)malloc(sizeof(int)*2);
for(int i = 0; i < numsSize-1; i++){
for(int j = i + 1; j <numsSize;j++){
if(nums[i] + nums[j] == target){
res[0] = i;
res[1] = j;
*returnSize = 2;
return res;
}
}
}
return res;
}
🍓🍓WAY3 C ++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hash;//无序哈希表,速度快,时间复杂度O(1)
for(int i = 0; i<nums.size(); i++){
if(hash.count(target - nums[i])){ //被查找元素的个数,结果是1或者0
return {hash[target - nums[i]],i};
}
hash[nums[i]] = i;//记录每个数字出现的下标
}
return {-1,-1};
}
};
👉THINKING
采取一边插入哈希表一边寻找一边在已经插入的哈希表中寻找的方式,每次都拿着即将插入哈希表的数字然后在哈希表中找是否存在剩下的那个函数。
在循环里面查找的话时间复杂度变高,但是哈希表查找时间可以说是O(1)是常数(避免冲突的算法采用链地址可能不为O(1),但一般不用链地址来避免冲突),所以总的时间复杂度就为O(n),哈希表是一种用空间换取时间的算法。
🍓🍓WAY3 Java3种 借鉴➕总结
/**
* -两数之和
* -给出一个数组 以及目标 如果数组里两个数相加=目标 则将这两个数的下标返回
* -下标不重复
* -方法一 暴力破解 两层循环 遍历
* -方法二 用哈希表 HashMap 有序+不重复,只需要将所有数值存入哈希表 然后在遍历一遍 target-当前值 看看是否有指定的键或值 返回
* -方法三 遍历一遍 target-当前值 判断哈希表里是否有指定的值 没有的话则将此次值添加进哈希表 与方法二速度持平 看情况论速度
*/
public class TwoSum {
/**
* -时间复杂度超高
* @param nums
* @param target
* @return
*/
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
/**
* -时间复杂度比暴力的高很多
* @param nums
* @param target
* @return
*/
public int[] twoSum1(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
/**
* -速度更快 时间复杂度比twoSum1低
* @param nums
* @param target
* @return
*/
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<Integer,Integer>();
for(int i = 0;i < nums.length; i++){
if(map.containsKey(target - nums[i])){
return new int[]{map.get(target - nums[i]),i};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
public static void main(String[] args) {
TwoSum two = new TwoSum();
String s = Arrays.toString(two.twoSum1(new int[] {1,3,1,3,52,2},5));
System.out.println(s);
}
}
2019的最后一天,我找到了兼职(虽然与专业无关)
许愿2020万事胜意
希望可以上研,瘦下来,家人及自己身体健康
来源:力扣(LeetCode)以及借鉴优秀大神们总结
链接:https://leetcode-cn.com/problems/two-sum