leetcode题目(1)

目录

1.回文数

2.盛最多水的容器

3.罗马数字转整数

4.最长公共前缀

5.三数之和

6.最接近的三数之和


1.回文数

https://leetcode.cn/problems/palindrome-number/description/

cpp 复制代码
class Solution {
public:
    bool isPalindrome(int x) {
        //当x<0时肯定不为回文数,最后一位为0,若要回文只有0满足
        if(x < 0 || x % 10 == 0 && x != 0)
            return false;

        int ReverteNumber = 0;
        while(x > ReverteNumber)
        {
            ReverteNumber = ReverteNumber * 10 + x % 10;
            x /= 10;
        }

        return x == ReverteNumber || x == ReverteNumber / 10;
    }
};

2.盛最多水的容器

https://leetcode.cn/problems/container-with-most-water/description/

cpp 复制代码
class Solution {
public:
    int maxArea(vector<int>& height) {
        //双指针,left左指针,right右指针
        int left = 0,right = height.size()-1;
        int ans=0;
        
        while(left<right)
        {
            //面积为左右指针值小的*指针距离
            int area = min(height[left],height[right])*(right-left);
            //更新ans的值,存储面积最大的
            ans=max(ans,area);
            //每次移动值较小的指针
            if(height[left]<=height[right])
                ++left;
            else
                --right;
        }
        return ans;
    }
};

3.罗马数字转整数

https://leetcode.cn/problems/roman-to-integer/

cpp 复制代码
int romanToInt(char* s) {
    int symbolValues[26];
    //用ASII值相减,symbolValues[8]用来表示I,即数字1
    symbolValues['I' - 'A'] = 1;
    symbolValues['V' - 'A'] = 5;
    symbolValues['X' - 'A'] = 10;
    symbolValues['L' - 'A'] = 50;
    symbolValues['C' - 'A'] = 100;
    symbolValues['D' - 'A'] = 500;
    symbolValues['M' - 'A'] = 1000;

    int ans = 0;
    int n = strlen(s);
    for(int i = 0;i<n;++i)
    {
        int value = symbolValues[s[i]-'A'];
        if(i < n-1 && value < symbolValues[s[i+1] - 'A'])
        {
            ans -= value; 
        }
        else
        {
            ans += value;
        }
    }
    return ans;
}

4.最长公共前缀

https://leetcode.cn/problems/longest-common-prefix/

cpp 复制代码
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size() == 0)
            return "";
        int length = strs[0].size();
        int count = strs.size();
        for(int i = 0;i<length;++i)//遍历第一个字符串
        {
            char c = strs[0][i];
            for(int j = 1;j<count;++j)
            {
                if(i == strs[j].size() || strs[j][i] != c)
                {
                    //substr从某一位置提取一定字符
                    return strs[0].substr(0,i);
                }
            }
        }
        return strs[0];
    }
};

5.三数之和

https://leetcode.cn/problems/3sum/description/

cpp 复制代码
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        // ranges::sort(nums);
        //数组排序
        sort(nums.begin(),nums.end());
        vector<vector<int>> ans;
        int n = nums.size();
        // 遍历数组,将每个元素作为可能的三元组中的第一个元素
        for (int i = 0; i < n - 2; i++) {
            int x = nums[i];// 当前元素
            if (i && x == nums[i - 1]) continue; // 跳过重复数字
            if (x + nums[i + 1] + nums[i + 2] > 0) break; // 当前元素与后两个之和大于0,结束循环
            if (x + nums[n - 2] + nums[n - 1] < 0) continue; // 当前元素与后两个之和小于0,跳过当前循环
            int j = i + 1, k = n - 1;// 双指针找剩余两个数,i的后一位和数组的最后一位
            while (j < k) {
                int s = x + nums[j] + nums[k];
                if (s > 0) {
                    k--;
                } else if (s < 0) {
                    j++;
                } else {
                    ans.push_back({x, nums[j], nums[k]});// 找到符合条件的加入列表
                    for (j++; j < k && nums[j] == nums[j - 1]; j++); // 跳过重复数字
                    for (k--; k > j && nums[k] == nums[k + 1]; k--); // 跳过重复数字
                }
            }
        }
        return ans;
    }
};

6.最接近的三数之和

https://leetcode.cn/problems/3sum-closest/description/

cpp 复制代码
class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        int ans,n = nums.size();
        int min_diff =  INT_MAX;// 最大正整数
        for(int i = 0; i < n - 2; i++){
            int x = nums[i];
            if(i > 0 && x == nums[i - 1]) continue;

            int s = x + nums[i + 1] + nums[i + 2];
            if(s > target){
                if(s - target < min_diff){
                    ans = s;
                }
                break;
            }

            s = x + nums[n - 2] + nums[n - 1];
            if(s < target){
                if(target - s < min_diff){
                    min_diff = target - s;
                    ans = s;
                }
                continue;
            }

            int j = i + 1, k = n - 1;
            while(j < k){
                s = x + nums[j] + nums[k];
                if(s == target){
                    return target;
                }
                if(s > target){
                    if(s - target < min_diff){
                        min_diff = s - target;
                        ans = s;
                    }
                    k--;
                }
                else{
                    if(target - s < min_diff){
                        min_diff = target - s;
                        ans = s;
                    }
                    j++;
                }
            }
        }
        return ans;
    }
};
相关推荐
曦樂~5 小时前
Cpp面筋
c语言·c++
道尔柯南5 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
Dream it possible!8 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
心抵鹊9 小时前
算法之双指针系列(一)
算法·leetcode
十二9 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
Pniubi10 小时前
力扣560.和为k的子数组
算法·leetcode·职场和发展
D e re k ZH11 小时前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
Pniubi11 小时前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展
zjxtxdy12 小时前
C++面向对象程序开发-类与对象
开发语言·c++
東隅已逝,桑榆非晚14 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法