Leetcode---数组篇

题目一 寻找数组的中心索引

原题链接

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int sum1 = 0, sum2 = 0;
        for(int j = 0; j < nums.size(); j ++) {
                sum2 += nums[j];
            }
        for(int i = 0; i < nums.size(); i ++) {
            if(sum1 == sum2 - sum1 - nums[i]) return i;
            sum1 += nums[i] ;
        }
        return -1;
    }
};

题目二 搜索插入位置

原题链接
在这里插入图片描述

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0, right = n - 1;
        while(left < right) {
            int mid = (left + right) >> 1;
            if(nums[mid] < target) left = mid + 1;
            else right = mid;
        }
        if(nums[left] < target) return left + 1;
        return left;
    }
};

题目三 合并区间

原题链接

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n = intervals.size();
        sort(intervals.begin(), intervals.end());
        vector<vector<int>> res;
        int i = 0;
        res.push_back(intervals[i]);
        for(int j = i + 1; j < n; j ++) {
            int left = intervals[j][0];
            int right = intervals[j][1];
            if(res[i][1] >= left) res[i][1] = max(right, res[i][1]);
            else {
                i ++;
                res.push_back(intervals[j]);
            } 
        }
        return res;
    }
};

题目四 旋转矩阵

原题链接

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        // 顺时针旋转90度 === 先左上角加右下角对角线翻转再中轴线垂直翻转即可
        // 对角线翻转
        int n = matrix.size();
        for(int i = 0; i < n; i ++) {
            for(int j = 0; j < i; j ++) {
                swap(matrix[i][j], matrix[j][i]);
            }
        }
        // 水平翻转
        for(int i = 0; i < n; i ++) {
            for(int j = 0; j < n / 2; j ++) {
                swap(matrix[i][j], matrix[i][n - j - 1]);
            }
        }
    }
};

题目五 零矩阵

原题链接

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        vector<vector<int>> zeros;
        int n = matrix.size();
        int m = matrix[0].size();
        int k = 0;
        for(int i = 0; i < n; i ++)
            for(int j = 0; j < m; j ++)
            {
                if(matrix[i][j] == 0) {
                    zeros.push_back({i, j});
                    k ++;
                }
            }
        for(int i = 0; i < k ; i ++) {
            for(int j = 0; j < m; j ++) {
                matrix[zeros[i][0]][j] = 0;
            }
        }
        for(int i = 0; i < k ; i ++) {
            for(int j = 0; j < n; j ++) {
                matrix[j][zeros[i][1]] = 0;
            }
        }
    }
};

题目六 对角线遍历

原题链接

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
        int n = mat.size();
        int m = mat[0].size();
        vector<int> result;
        for(int i = 0, index = 0; i < n + m - 1; i ++) {
            if(i % 2 == 0) {
                for(int j = min(i, n - 1); j >= max(i - m + 1, 0); j --){
                    result.push_back(mat[j][i - j]);
                }
            }else {
                for(int j = max(i - m + 1, 0); j <= min(i ,n - 1); j ++) {
                    result.push_back(mat[j][i - j]);
                }
            }
        }
        return result;
    }
};

题目七 最长公共前缀

原题链接

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string res;
        res = strs[0];
        int n = strs.size();
        for(int i = 1;i < n; i ++)
            for(int j = 0; j < res.size(); j ++){
                if(strs[i][j] != res[j]) {
                    res.erase(j);
                }
            }
        return  res;
    }
};

题目八 最长回文子串

原题链接

class Solution {
public:
    string longestPalindrome(string s) {
        // int n = s.length();
        // if(n < 2){
        //     return s;
        // }
        // //动态规划
        // vector<vector<int>> dp(n, vector<int>(n));

        // int maxlen = 1;
        // int begin = 0;
        // // 初始化所有一个的都是回文串
        // for(int i = 0; i < n; i ++) dp[i][i] = true;
        // for(int len = 2; len <= n; len ++) {
        //     for(int i = 0; i < n; i ++){
        //         int j = i + len - 1;
        //         if(j >= n) break;
        //         if(s[i] != s[j]){
        //             dp[i][j] = false;
        //         }else {
        //             if(j - i >= 3){
        //                 dp[i][j] = dp[i + 1][j - 1];
        //             }else {
        //                 dp[i][j] = true;
        //             }
        //         }
        //         if(dp[i][j] && len > maxlen){
        //             maxlen = len;
        //             begin = i;
        //         }
        //     }
        // }
        // return s.substr(begin, maxlen);
        // 中心扩散法
        int start = 0, end = 0;
        for(int i = 0; i < s.size(); i ++) {
            auto [left1, right1] = expandAroundCenter(s, i, i);
            auto [left2, right2] = expandAroundCenter(s, i, i + 1);
            if(right1 - left1 > end - start){
                start = left1;
                end = right1;
            }
            if(right2 - left2 > end - start) {
                start = left2;
                end = right2;
            }
        }
        return s.substr(start, end - start + 1);
    }

    pair<int,int> expandAroundCenter(string s, int left, int right) {
        while(left >= 0 && right < s.size() && s[left] == s[right]) {
            left --;
            right ++;
        }
        return {left + 1, right - 1};
    }
};

题目九 翻转字符串里的单词

原题链接

class Solution {
public:
    string reverseWords(string s) {
        // 双指针
        int m = s.size() - 1;
        while(s[m] == ' ' && m > 0) m --;
        string res;

        int n = m;
        while(m >= 0){
            while( m >= 0&&s[m] != ' ' ) m --;
            res += s.substr(m + 1, n - m) + " ";
            while(m >= 0 && s[m] == ' ' ) m --;
            n = m;
        }
        return res.substr(0, res.size() - 1);
    }
};

题目十 实现strStr()

原题链接

KMP算法 看题解和分析之前有过总结

KMP详解

class Solution {
public:
    int strStr(string haystack, string needle) {
        int n = haystack.size();
        int m = needle.size();
        
        if (m == 0) return 0; // 如果 needle 是空串,返回 0
        
        // 构建 next 数组
        vector<int> next(m, 0);
        for (int i = 1, j = 0; i < m; i++) {
            while (j > 0 && needle[i] != needle[j]) {
                j = next[j - 1]; // 回退 j 到上一个最长前后缀的位置
            }
            if (needle[i] == needle[j]) {
                j++; // 匹配成功,增加 j
            }
            next[i] = j; // 更新 next 数组
        }
        
        // 主匹配过程
        for (int i = 0, j = 0; i < n; i++) {
            while (j > 0 && haystack[i] != needle[j]) {
                j = next[j - 1]; // 回退 j
            }
            if (haystack[i] == needle[j]) {
                j++; // 匹配成功,增加 j
            }
            if (j == m) { // 完全匹配
                return i - m + 1; // 返回匹配的起始位置
            }
        }
        
        return -1; // 如果没有匹配,返回 -1
    }
};

题目十一 反转字符串

原题链接

class Solution {
public:
    void reverseString(vector<char>& s) {
        int i = 0, j = s.size() - 1;
        while(i < j) {
            swap(s[i ++], s[j --]);
        }
    }
};

题目十二 数组拆分

原题链接

class Solution {
public:
    int arrayPairSum(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int res = 0;
        for(int i = 0; i < n; i += 2) {
            res += nums[i];
        }
        return res;
    }
};

题目十三 两数之和|| - 输入有序数组

原题链接

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int n = numbers.size();
        int i = 0, j = n - 1;
        while(i < j){
            if(numbers[i] + numbers[j] == target){
                return {i + 1, j + 1};
            }
            if(numbers[i] + numbers[j] < target){
                i ++;
            }
            if(numbers[i] + numbers[j] > target){
                j --;
            } 
        }
        
        return {};
    }
};

题目十四 移除元素

原题链接

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int n = nums.size();
        int slow = 0, fast = 0;
        while(fast < n) {
            if(nums[fast] != val) {
                nums[slow ++] = nums[fast];
            }
            fast ++;
        }
        return slow;
    }
};

题目十五 最大连续1的个数

原题链接

class Solution {
public:
    int findMaxConsecutiveOnes(vector<int>& nums) {
        int n = nums.size();
        int maxLenth = 0;
        int i = 0, j = 0;
        while(j < n) {
            if(nums[j] == 1) {
                j ++;
            }else {
                maxLenth = max(maxLenth, j - i);
                j ++;
                i = j;
            }
        }
        maxLenth = max(maxLenth, j - i);
        return maxLenth;
    }
};

题目十六 长度最小的子数组

原题链接

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();
        int i = 0, j = 0;
        int sum = 0;
        int minLenth = n + 1;
        while(j < n) {
            sum += nums[j];
            while(sum >= target){           
                minLenth = min(minLenth, j - i + 1);
                sum -= nums[i ++];
            }
            j ++;
        }
        if(minLenth == n + 1) return 0;
        return minLenth; 
    }
};
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值