百度codetop-3

1、爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

class Solution {
public:
	int climbStairs(int n) {
		int p = 0, q = 0, r = 1;
		while(n--){
			p = q;
			q = r;
			r = p + q;
		}
		return r;
	}
};

2、最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

class Solution {
public:
	vector<int> getLeastNumbers(vector<int>& arr, int k) {
		vector<int> res;
		if(k == 0) return res;
		priority_queue<int> queue;
		for(int i = 0; i < k; i++)
			queue.push(arr[i]);
		for(int i = k; i < arr.size(); i++){
			if(queue.top() > arr[i]){
				queue.pop();
				queue.push(arr[i]);
			}
		}
		for(int i = 0; i < k; i++){
			res.push_back(queue.top());
			queue.pop();
		}
		return res;
	}
};

3、二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

class Solution {
public:
	bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
		if(matrix.size() == 0) return false;
		int row = matrix.size(), col = matrix[0].size();
		int i = row - 1, j = 0;
		while(i >= 0 && j < col){
			if(matrix[i][j] > target) i--;
			else if(matrix[i][j] < target) j++;
			else return true;
		}
		return false;
	}
};

4、pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。

class Solution {
public:
	double quickmul(int x, long long n){
		if(n == 0) return 1.0;
		double y = quickmul(x, N / 2);
		return N % 2 == 0 ? y * y : y * y * x; 
	}
	double myPow(double x, int n) {
		long long N = n;
		return N > 0 ? quickmul(x, N) : 1.0 / quickmul(x, -N);
	}
};

5、数组中的第k个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

class Solution {
public:
	void quicksort(vector<int>& nums, int l, int r){
		if(l >= r) return;
		int num = nums[l];
		int left = l, right = r;
		while(left < right){
			while(left < right && nums[right] >= num)
				right--;
			nums[left] = nums[right];
			while(left < right && nums[left] < num)
				left++;
			nums[right] = nums[left];
		}
		nums[left] = num;
		quicksort(nums, l, left -1);
		quicksort(nums, left + 1, r);
	}
	int findKthLargest(vector<int>& nums, int k) {
		quicksort(nums, 0, nums.size() - 1);
		return nums[nums.size() - k];
	}
};

6、无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

class Solution {
public:
	int lengthOfLongestSubstring(string s) {
		int res = 0;
		if(s.size() == 0) return res;
		unordered_map<char, int> map;
		int i = 0;
		for(int j = 0; j < s.size(); j++){
			if(map.find(s[j]) != map.end()){
				i = max(i, map[s[j]]);
			}
			res = max(res, j - i + 1);
			map[s[j]] = j + 1;
		}
		return res;
	}
};

7、最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。

class MinStack {
public:
	stack<int> stack1;
	stack<int> stack2;
	MinStack(){};
	void push(int x){
		if(stack2.empty() || stack2.top() >= x)
			stack2.push(x);
		stack1.push(x);
	}
	void pop(){
		if(stack1.top() == stack2.top())
			stack2.pop();
		stack1.pop();
	}
	int top(){
		return stack1.top();
	}
	int getMin(){
		return stack2.top();
	}
};

8、最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

class Solution {
public:
	int maxSubArray(vector<int>& nums) {
		int res = nums[0];
		for(int i = 1; i < nums.size(); i++){
			nums[i] += max(nums[i - 1], 0);
			res = max(res, nums[i]);
		}
		return res;
	}
};

9、两数之和-2
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
		int l = 0, r = numbers.size() - 1;
		while(l < r){
			int sum = numbers[l] + numbers[r];
			if(sum == target)
				return {l + 1, r + 1};
			else if(sum > target)
				r--;
			else
				l++;
		}
		return {-1, -1};
	}
};

10、字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

class Solution {
public:
    string multiply(string num1, string num2) {
		int m = num1.size(), n = num2.size();
		string s(m + n, '0');
		for(int i = m - 1; i >= 0; i--){
			for(int j = n - 1; j >= 0; j--){
				int cur = (num1[i] - '0') * (num2[j] - '0') + (s[i + j + 1] - '0');
				s[i + j + 1] = cur % 10 + '0';
				s[i + j] += cur / 10;
			}
		}
		for(int i = 0; i < m + n; i++){
			if(s[i] != '0') return s.substr(i);
		}
		return '0';
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值