LeetCode 1-10 題 3、4、5、7、9、10
阿新 • • 發佈:2020-09-10
難度簡單9073
給定一個整數陣列 nums
和一個目標值 target
,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
示例:
給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
雜湊表或者直接遍歷呀
- class Solution {
- public:
-
vector<int> twoSum(vector<int>& nums, int target) {
- for(int i=0;i<nums.size();i++){
- for(int j=i+1;j<nums.size();j++){
- if(nums[i]+nums[j]==target){
- return {i,j};
- }
- }
- }
- return {};
- }
- };
難度中等4860
給出兩個非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。
如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807
這裡要注意,因為沒有說是整型,就算用long long也不行!
乖乖用sum and carry 模擬就好了
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * ListNode *next;
-
* ListNode(int x) : val(x), next(NULL) {}
- * };
- */
- class Solution {
- public:
- ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
- ListNode* l3= new ListNode(-1);
- ListNode* ans=l3;
- int carry=0;
- int sum=0;
- while(l1||l2){
- sum=carry;
- if(l1){
- sum+=l1->val;
- l1=l1->next;
- }
- if(l2){
- sum+=l2->val;
- l2=l2->next;
- }
- carry=sum/10;
- sum=sum%10;
- l3->next= new ListNode(sum);
- l3=l3->next;
- }
- if(carry!=0) l3->next= new ListNode(carry);
- return ans->next;
- }
- };
難度中等4282
給定一個字串,請你找出其中不含有重複字元的最長子串的長度。
示例1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其
長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b"
,所以其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是"wke"
,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke"
是一個子序列,不是子串。
典型的滑動視窗題哦!
- class Solution {
- public:
- int lengthOfLongestSubstring(string s) {
- unordered_map<char,int> windows;
- int left=0,right=0;
- int ans=0;
- while(right<s.size()){
- char c=s[right];
- windows[c]++;
- right++;
- while(windows[c]>1){
- char c=s[left];
- left++;
- windows[c]--;
- }
- ans=max(ans,right-left);
- }
- return ans;
- }
- };
難度困難3160
給定兩個大小為 m 和 n 的正序(從小到大)陣列nums1
和nums2
。
請你找出這兩個正序陣列的中位數,並且要求演算法的時間復