LeetCode题解分享

1.两数之和

相信我们做第一道题的时候是很难受的,力扣上连启蒙题都这么难,那后面的会怎么样?让我们静下心来,好好看这一道力扣启蒙题
这道题是让我们在一个数组里找一对和为targe的数,并返回两个数的下标

方法1:暴力穷举

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
	int i,j;
	int *result=NULL; 先定义好要返回的数组
	用i作为第一个数的下标,j作为第二个数的下标,遍历整个数组
	for (i=0;i<numsSize;i++){
		for (j=i+1;j<numsSize;j++){
			if(nums[i]+nums[j] == target){ 找到目标数组
				result=(int*)malloc(sizeof(int)*2);
                result[0]=i;
                result[1]=j;
                return result;
			}
		}
	}
	return result;
}

方法2:哈希表法

Python 版本

def twoSum(nums, target):
	hash = {} 声明一个字典做哈希表
	for i in range(len(nums)): 遍历数组
		p = target-nums[i]  求出nums[i]和target的差值
		if p in hash:       看看p是否在哈希表内,如果在就返回两者的下标
			return [hash[p],i]	
		hash[nums] = i		如果没有,就把他加进去

Java 版本

public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> record = new HashMap<>();
        for(int i=0;i < nums.length;i++){
            int num = target - nums[i];
            if(record.containsKey(num) == true) {
                int ans[]={record.get(num), i};
                return ans;
            }
            record.put(nums[i],i);
        }
        int ans[] = {-1,-1};
        return ans;
}

C++版本

vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> record;
        for(int i=0;i<nums.size();i++){
            int num = target-nums[i];
            if(record.find(num) != record.end()) // 如果num在哈希表内
                return {record[num],i};
            record[nums[i]] = i;
        } 
        return {-1, -3};
}

2.两数相加

最有效的方法就是两个链表一位一位的加,需要进位的就进位
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
	int sum=0;
	struct ListNode* ans = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* sta = ans;
    while( l1 || l2 || sum) {
    struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
        sta->next = p;
        if ( l1 ) { sum += l1->val; l1=l1->next; } 
        if ( l2 ) { sum += l2->val; l2=l2->next; }
        p->val = sum % 10;
        sum /= 10;
        p->next = NULL;
        sta = p;
    }
    return ans->next;
}

3.无重复字符的最长字串

def lengthOfLongestSubstring(self, s):
        if not s: return 0#如果字符串是空,直接返回0
        left = 0             	#left是滑动窗口的左边界
        lookup = set()		 	#lookup是滑动窗口的存储结构
        max_len = 0				# max_len是huadongchuang最长长度
        cur_len = 0				# cur_len是滑动窗口的当前长度
        for i in range(len(s)):	# 对s进行遍历
            cur_len += 1		# 每经过一个元素,就将cur_len加1
            while s[i] in lookup:	# 如果下一个元素在列表内,就把窗口最左边的移除
                lookup.remove(s[left])
                left += 1      	# 移除之后,窗口左边界向右移动
                cur_len -= 1	# 当前长度减一
            lookup.add(s[i])	# 将下一个元素加入窗口
            max_len = max(max_len, cur_len) # 更新一下max_len的值
        return max_len
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值