vector - milkandbread/summary-interview GitHub Wiki

1 有序数组中不同平方值的个数(头条面试题)---C++实现
题目:

求解一个有序数组不同平方值的个数,{-1,-1,0,1,1}这里平方值只有0,1两种情况,返回2;{-3,-1,0,0,2,3}这里拼房族有0,1,4,9共4中情况,返回4。
要求:时间复杂度O(n)空间复杂度O(1)

思路:

刚开始看到这题,哈希表应该是大多数人都能想到的,且复杂度要求都能满足。就是遍历数组,把每个数的平方放入哈希表中去重即可。
但是这种想法很难通过面试,因为有序的条件没有利用到。

正解:

有序数组普遍是利用双指针问题求解,这里也一样。每次检查头尾指针的和是等于0、大于0还是小于0.根据这3中情况分析。注意数字可能重复,需要去重。
int diffSquareNum(const vector<int>& nums) {
	if (!nums.size())
		return 0;
	int left = 0;
	int right = nums.size() - 1;
	int sum = 0;
	while (left <= right) {
		if (nums[left] + nums[right] == 0) {
			sum++;
			int t = nums[left];
			//这里是为了去重
			while (left <= right && nums[left] == t)
				left++;
			while (left <= right && nums[right] == -t)
				right--;
		}
		else if (nums[left] + nums[right] < 0) {
			sum++;
			int t = nums[left];
			while (left <= right && nums[left] == t)
				left++;
		}
		else{
			sum++;
			int t = nums[right];
			while (left <= right && nums[right] == t)
				right--;
		}
	}
	return sum;
}

2 买卖股票的最佳时机

如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if ( prices.size()<1)
            return 0;
        int res=0;
        int min=prices[0];
        for(int i=1;i<prices.size();i++){
            if (prices[i]<min)
                min = prices[i];
            if (prices[i]-min>res)
                res = prices[i] - min;
        }
        return res;
    }
};

3 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。

#include <iostream>

bool duplicate(int numbers[], int length, int * duplication){
    if(numbers == nullptr || length <= 0){
        return false;
    }
    for(int i = 0;i < length;i ++){
        if(numbers[i] < 0 || numbers[i] > length - 1)
            return false;
    }
    for(int i = 0;i < length;i ++){
        while(numbers[i] != i){
            if(numbers[i] == numbers[numbers[i]]){
                * duplication = numbers[i];
                return true;
            }
            int temp = numbers[i];
            numbers[i] = numbers[temp];
            numbers[temp] = temp;
        }
    }
    return false;
}

int main(int argc, const char * argv[]) {
    int numbers[] = {3, 1, 2, 0, 2, 5, 3};
    int dup;
    if(duplicate(numbers, 7, & dup)){
        std::cout << dup << std::endl;
    }
}

4 二分查找

/*折半查找*/
int Binary_Search(int a*,int n,int key)
{
    int low,high,mid;
    low=1;     /*定义最底下标为记录首位*/
    high=n;    /*定义最高下标为记录末位*/
    while(low<=high)
    {
        mid=(low+high)/2;    /*折半*/
        if(key<a[mid])
            high=mid-1;
        if(key>a[mid])
            low=mid+1;
        else
            return mid;
    }
    return 0;
}
⚠️ **GitHub.com Fallback** ⚠️