leetcode

165 阅读1分钟

数据结构

  • 链表
   // 建立一个新链表(leetcode86)
   ListNode* max_x= new ListNode(0) //建立一个列表需要new
   
   
   // 快慢指针(leetcode)
   1、slow->1 fast->2
   2、fast = null -> 无环
   https://blog.csdn.net/qq_21815981/article/details/79833976
  • 优先队列
   // push 和 emplace的区别 (leetcode 973)
   1、push可以传入已构造对象
   2、emplace可以传入构造对象所需元素
   // 比较函数 (leetcode 347)
     struct cmp1{
	bool operator()(pair<int,int> p1,pair<int,int> p2){
		return p1.first > p2.first; //大 
	      }
       }
    // hash和pair之间的关系 (leetcode 347)
  • 哈希表
   // 将相同key的值放在一起(leetcode 49)
      unordered_map<string,vector<string>>map;

二分法

  • 二分法中的“二”并不是指将其分成相等的两份,而是取一个值与target value进行比较,故不要纠结每次的“二”是否在中间。
//二分法的区间问题
//《1》左闭右闭
int search(int nums[], int size, int target) //nums是数组,size是数组的大小,target是需要查找的值
{
    int left = 0;
    int right = size - 1;	// 定义了target在左闭右闭的区间内,[left, right]
    while (left <= right) {	//当left == right时,区间[left, right]仍然有效
        int middle = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出
        if (nums[middle] > target) {
            right = middle - 1;	//target在左区间,所以[left, middle - 1]
        } else if (nums[middle] < target) {
            left = middle + 1;	//target在右区间,所以[middle + 1, right]
        } else {	//既不在左边,也不在右边,那就是找到答案了
            return middle;
        }
    }
    //没有找到目标值
    return -1;
}

//《2》左闭右闭
int search(int nums[], int size, int target)
{
	int left = 0;
	int right = size; //定义target在左闭右开的区间里,即[left, right)
	while (left < right) {	//因为left = right的时候,在[left, right)区间上无意义
		int middle = left + ((right - left) / 2);
		if (nums[middle] > target) {
			right = middle; //target 在左区间,在[left, middle)中 
		} else if (nums[middle] < target) {
			left = middle + 1;
		} else {
			return middle;
		}
	} 
    // 没找到就返回-1
	return -1;
}