leetcode 刷题 算法 1

Posted suizhixxie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 刷题 算法 1相关的知识,希望对你有一定的参考价值。

只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int x = 0;
        for (auto ite : nums)
            x ^= ite;
        return x;
    }
};

 说明:采用异或,0与任何数异或得到数字本身 两个相同的数字异或等于0

不用去考虑是不是按顺序从可变数组中取元素

如过我们的测试数据是 {0,1,2,1,0}

机器会 都转化成2进制码   

0 :0000

1: 0001  异或得 0001

2 :0010  异或得 0011

1 :0001  异或得 0010

0 :0000  异或得 0010

所得结果转化成10进制就是2

求众数

 给定一个大小为 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

int majorityNumber(vector<int>& nums)
{
    int count = 1;
    int maj = nums[0];
    for (int i=1; i!=nums.size(); i++)
    {
        if(nums[i]==maj) count++;
        else{
            count--;
            if(count ==0)
            {
                maj = nums[i];
                cout = 1;
                
            }
        }
        
    }
    return maj;
}

 

 摩尔投票法:因为题目对众数的要求是出现次数大于n/2的,我们可以用一个变量count来计数,如果他的出现次数大于n/2,那么它的count一定会大于0.

 搜索矩阵  

矩阵的特性 如下

  • 每行的元素从左到右升序排列
  • 每列的元素从上到下升序排列
[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

 

bool searchMatrix(vector<vector<int>>& matrix,int target)
{
    if (matrix.size() == 0) return false;
    int j = 0;
    int i = matrix[0].size()-1;
    while (j<matrix.size()&&i>-1)
    {
        if (target == matrix[j][i])
            {
                return true;
            }
        if (matrix[j][i] < target)
            {
                j++;
            }
        else{
            i--;
        }
        
    }
    return false;
    
}

 

注意:不能简单使用二分法 因为它每行之间不是单调递增的 只能就根据每行最后一个元素大小来简单筛选,或者通过每行第一个元素

 合并两个有序数组

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 使得 num1 成为一个有序数组。 

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

 

 

 void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int t = m+n-1;
        int i = m-1, j=n-1;
        while(i>=0&&j>=0)
        {
            if (nums2[i]>nums1[j])
            {
                nums1[t] = nums2[i];
                t--;
                i--;
            }
            else{
                nums1[t] = nums1[i];
                t--;
                i--;
            }
            
        }       
    }

 注意:我们采用倒着插入的方法 将nums2中的元素比较放入nums1

 

以上是关于leetcode 刷题 算法 1的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 系统刷题1_代码风格及边界

leetcode之贪心算法刷题总结1

LeetCode刷题笔记-数据结构-day2

LeetCode刷题计划

LeetCode刷题计划

LeetCode刷题计划