10/100最长公共前缀 、11/100 三数之和、12/100最接近的三数之和

题目:10/100最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。
10/100最长公共前缀 、11/100 三数之和、12/100最接近的三数之和_第1张图片

题解

思路比较简单,以此一个字符为基准,依次比较

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        //依次遍历每个字符串
        string compareStr = strs[0];
        for(int k = 1; k<strs.size(); k++)
        {
            string str = strs[k];
            if(compareStr.size() == 0)
            {
                return "";
            }
            int i = 0;
            int j = 0;
            while(i<str.size() && j<compareStr.size() && (str[i] == compareStr[j]))
            {
                i++;
                j++;
            }
            compareStr = compareStr.substr(0, i);//需要一个接受值 否则compare不变的
            cout<<"compareStr"<<compareStr;
            
        }
        return compareStr;
    }
};

题目:11/100 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。
10/100最长公共前缀 、11/100 三数之和、12/100最接近的三数之和_第2张图片

题解

第一反应考虑之前做过地两数之和,用哈希表,但题目要求结果不能有重复元素,而且两数之和返回下标,三数之和返回数据,做法不尽相同。
也很容易考虑三重循环去判断结果,同样由于重复元素,考虑排序,将元素递增排序,将第二重循环与第三重循环通过双指针合并到一个循环中,第二个元素递增,第三个元素递减,当相加大于X时,第三个左移,当相加小于X时,第二个右移;全程跳过重复元素
尝试编写代码:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<vector<int>> res;
        for(int first = 0; first <nums.size(); first++)
        {
           // if(num[first] == num[first++])
           if(first>0 && nums[first] == nums[first-1])//是当前的元素和上一个元素相同 这个元素就pass 不要和下一个元素比较
            {
                continue;
            }
            int third = nums.size()-1;
            int target = -nums[first];
            for(int second = first+1; second<nums.size(); second++)
            {
                if(second>first+1 && nums[second] == nums[second-1])
                {
                    continue;
                }
                while(second<third && nums[second]+nums[third] > target)//注意边界 大了3左移  小了不用判断 会从下一个循环second = first+1
                {
                    third--;
                }
                if(second == third)
                break;

                if(nums[second]+ nums[third] == target)
                {
                    res.push_back({nums[first],nums[second], nums[third]});
                }
            }
        }
        return res;
    }
};

题目:最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。
10/100最长公共前缀 、11/100 三数之和、12/100最接近的三数之和_第3张图片

题解:

跟上一题一样的思路 排序 加双指针 只是多维护一个最小绝对值

class Solution {

public:

    int threeSumClosest(vector<int>& nums, int target) {

        sort(nums.begin(), nums.end());

        int min_res = INT_MAX;//与target求差绝对值最小

        int res;

        for (int i = 0; i < nums.size()-2; ++i) {

            int left = i + 1;

            int right = nums.size() - 1;

            while (left < right)
            {
                if (min_res > abs(nums[i] + nums[left] + nums[right] - target)) {
                    res = nums[i] + nums[left] + nums[right];
                    min_res = abs(res - target);
                }

                if (nums[i] + nums[left] + nums[right] > target) right--;
                else if (nums[i] + nums[left] + nums[right] < target) left++;
                else break;

            }

        }

        return res;

    }

};

你可能感兴趣的:(刷题新航路!,算法,数据结构,leetcode)