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