8.1 1. 两数之和

  1. class Solution {
  2. public:
  3. vector<int> twoSum(vector<int>& nums, int target) {
  4. //利用pair保存下标信息,first为元素值,second参数为原始下标
  5. pair<int,int> temp[nums.size()];
  6. for(int i=0;i<nums.size();i++){
  7. temp[i]={nums[i],i};
  8. }
  9. //排序,以便运用双指针
  10. sort(temp,temp+nums.size());
  11. int left=0,right=nums.size()-1;
  12. while(left<right){
  13. int sum=temp[left].first+temp[right].first;
  14. if(sum==target){
  15. return {temp[left].second,temp[right].second};
  16. }else if(sum>target){
  17. right--; //让sum小一点
  18. }else if(sum<target){
  19. left++; //让sum大一点
  20. }
  21. }
  22. return {-1,-1};
  23. }
  24. };

9.1 26. 删除有序数组中的重复项

  1. class Solution {
  2. public:
  3. int removeDuplicates(vector<int>& nums) {
  4. if(nums.size()==0){
  5. return 0;
  6. }
  7. int slow=0,fast=0;
  8. while(fast<nums.size()){
  9. if(nums[fast]!=nums[slow]){
  10. slow++;
  11. //记录不重复元素
  12. nums[slow]=nums[fast];
  13. }
  14. fast++;
  15. }
  16. //数组长度=索引+1
  17. return slow+1;
  18. }
  19. };

9.2 83. 删除排序链表中的重复元素

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode() : val(0), next(nullptr) {}
  7. * ListNode(int x) : val(x), next(nullptr) {}
  8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13. ListNode* deleteDuplicates(ListNode* head) {
  14. if(head==NULL){
  15. return NULL;
  16. }
  17. ListNode *slow=head,*fast=head;
  18. while(fast!=NULL){
  19. if(fast->val!=slow->val){
  20. // num[slow]=num[fast]
  21. slow->next=fast;
  22. //slow++
  23. slow=slow->next;
  24. }
  25. //fast++
  26. fast=fast->next;
  27. }
  28. //断开与后面重复元素的连接
  29. slow->next=NULL;
  30. return head;
  31. }
  32. };

9.3 27. 移除元素

  1. class Solution {
  2. public:
  3. int removeElement(vector<int>& nums, int val) {
  4. int slow=0,fast=0;
  5. while(fast<nums.size()){
  6. if(nums[fast]!=val){
  7. //先赋值,再slow++,保证nums[0...slow-1]不包含val
  8. nums[slow]=nums[fast];
  9. slow++;
  10. }
  11. fast++;
  12. }
  13. return slow;
  14. }
  15. };

9.4 283. 移动零

  1. class Solution {
  2. public:
  3. void moveZeroes(vector<int>& nums) {
  4. //先用双指针移除0,再在末尾补足0
  5. int slow=0,fast=0;
  6. while(fast<nums.size()){
  7. if(nums[fast]!=0){
  8. nums[slow]=nums[fast];
  9. slow++;
  10. }
  11. fast++;
  12. }
  13. for(;slow<nums.size();slow++){
  14. nums[slow]=0;
  15. }
  16. }
  17. };

9.5 167. 两数之和 II - 输入有序数组

  1. class Solution {
  2. public:
  3. vector<int> twoSum(vector<int>& numbers, int target) {
  4. int left=0,right=numbers.size()-1;
  5. while(left<right){
  6. int sum=numbers[left]+numbers[right];
  7. if(sum==target){
  8. return {left+1,right+1};
  9. }else if(sum>target){
  10. right--;
  11. }else if(sum<target){
  12. left++;
  13. }
  14. }
  15. return {-1,-1};
  16. }
  17. };

9.6 5. 最长回文子串

  1. class Solution {
  2. public:
  3. string longestPalindrome(string s) {
  4. string res="";
  5. for(int i=0;i<s.length();i++){
  6. // 以 s[i] 为中心的最长回文子串
  7. string s1=palindrome(s,i,i);
  8. // 以 s[i] 、s[i+1]为中心的最长回文子串
  9. string s2=palindrome(s,i,i+1);
  10. // res = longest(res, s1, s2)
  11. // res=s2;
  12. res=res.length()>s1.length()?res:s1;
  13. res=res.length()>s2.length()?res:s2;
  14. }
  15. return res;
  16. }
  17. //从中心向两端扩散,分奇数偶数讨论,回文串有可能是奇,有可能偶
  18. // 在 s 中寻找以 s[l] 和 s[r] 为中心的最长回文串
  19. // 在 s 中寻找以 s[l] 和 s[r] 为中心的最长回文串
  20. string palindrome(string s, int l, int r) {
  21. // 防止索引越界
  22. while (l >= 0 && r < s.length() && s[l]==s[r]) {
  23. // 双指针,向两边展开
  24. l--; r++;
  25. }
  26. // 返回以 s[l] 和 s[r] 为中心的最长回文串
  27. return s.substr(l + 1, r-1-l);
  28. }
  29. };
  1. class Solution {
  2. public:
  3. string longestPalindrome(string s) {
  4. int n=s.length();
  5. if(n<2) return s;
  6. int m_max=1;
  7. int start=0;
  8. vector<vector<bool>> dp(n,vector<bool>(n));
  9. for(int i=0;i<n;i++){
  10. dp[i][i]=true;
  11. }
  12. for(int j=1;j<n;j++){
  13. for(int i=0;i<j;i++){
  14. if(s[i]!=s[j]){
  15. dp[i][j]=false;
  16. }else{
  17. if(j-i<3)
  18. dp[i][j]=true;
  19. else
  20. dp[i][j]=dp[i+1][j-1];
  21. }
  22. if(dp[i][j] && j-i+1>m_max){
  23. m_max=j-i+1;
  24. start=i;
  25. }
  26. }
  27. }
  28. return s.substr(start,m_max);
  29. }
  30. };