Vector OJ:电话号码组合 数组中超过一半的数字

目录

1.电话号码组合

2. JZ39 数组中出现次数超过一半的数字

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


1.电话号码组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

Vector OJ:电话号码组合 数组中超过一半的数字_第1张图片

示例:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
输入:digits = ""
输出:[]

思路:

 利用回溯来实现,也就是深度优先搜索(DFS)算法来探索所有可能的组合。

tmp为字符串,用于存储临时组合,还有一个名为nums的数组,用于存储数字与字母的映射关系。

数组ret用于存储我们将生成的最终组合。

Dfs函数是一个递归函数,执行深度优先搜索以生成所有可能的组合。它接受两个参数:当前在数字字符串中的位置posdigits字符串本身。

Dfs函数内部,我们检查是否已经到达了digits字符串的末尾.

如果是,我们将存储在tmp中的当前组合添加到ret向量中,并返回。

然后移除tmp中的最后一个字符,以进行回溯并尝试下一个字母。

否则,我们获取当前位置处数字的数值,并使用for循环遍历与该数字关联的字母。对于每个字母,我们将其添加到tmp字符串中,递归调用Dfs,并继续到下一个位置。

代码实现:

class Solution {
public:
    string tmp;
    vector nums={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    vector ret;

    void Dfs(size_t pos,string digits)
    {
        if(pos==digits.size())
        {
            ret.push_back(tmp);
            return;
        }

        int num=digits[pos]-'0';
        for(int i=0;i letterCombinations(string digits) {
        vector v;
        if(0==digits.size())
        return {};
        Dfs(0,digits);
        return ret;

    }
};

2. JZ39 数组中出现次数超过一半的数字

描述

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

输入描述:

保证数组输入非空,且保证有解

思路: 

countret,分别用来记录当前数字的出现次数和出现次数超过一半的数字。

因为ret出现的次数大于其他所有数字出现的次数,所以:

使用一个for循环遍历输入的numbers向量。在循环中,我们首先检查count是否为0,如果是,说明当前ret中记录的数字出现次数已经被抵消完了,因此我们将ret更新为当前遍历到的数字e

然后我们检查当前遍历到的数字e是否与ret相等,如果相等,我们将count递增;如果不相等,我们将count递减。

最终,我们返回ret,即为数组中出现次数超过一半的数字。

代码实现:

class Solution {
public:

    int MoreThanHalfNum_Solution(vector& numbers) {
        // write code here
        int count=0;
        int ret=0;
        for(int e:numbers)
        {
            if(count==0)
            ret=e;
            if(ret==e)
            count++;
            else
             count--;
        }
        return ret;
    }
};

 

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

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

思路:

while循环来遍历数组。循环条件是it不等于nums的倒数第二个位置,因为在循环体中我们会使用++it

如果it迭代器指向的数据不等于下一个,--it,因为在比较中++了it;

如果相等,将it向前移动一位并调用erase函数来删除当前位置的元素,然后继续下一轮循环。

最终,返回nums的长度,即为删除重复项后的数组长度。

代码实现:

class Solution {
public:
    int removeDuplicates(vector& nums) {
        vector::iterator it=nums.begin();
        while(it!=nums.end()-1)
        {
            if(*it!=*++it)
            {
                --it;
            }
            else
            {
                --it;
                it=nums.erase(it);
                continue;
            }
            it++;
        }
        return nums.size();

    }
};

 

你可能感兴趣的:(C++,深度优先,算法)