反转链表+数组中第k个最大元素+无重复字符的最长子串

本文介绍了两种常见的算法问题解决方案:1. 反转链表,通过迭代方式实现链表节点的反转;2. 在未排序数组中查找第k个最大元素,使用排序方法快速找到目标值。此外,还提及了无重复字符最长子串问题的滑动窗口解决策略。这些算法在数据结构和算法学习中具有重要地位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.反转链表.

原理图:
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
            ListNode* prev = nullptr;
            ListNode* curr = head;
            while(curr!=nullptr){
                ListNode *temp = curr->next;
                curr->next = prev;
                prev = curr;
                curr = temp;
            }
            return prev;
    }
};

2.数组中第k个最大元素

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

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

class Solution {
public:
    int findKthLargest(vector<int> &nums, int k) {
            sort(nums.begin(),nums.end());
            return nums[nums.size()-k];
    }
    // void swap(vector<int>&num,int i, int j){
    //     int temp = num[i];
    //     num[i]=num[j];
    //     num[j]=temp;
    // }
    // void quicksort(vector<int>&num,int low,int high){
	// if(high <= low)	return;
	
	// 	int i = low;
	// 	int j = high;
	// 	int key = num[low];
	// 	while(i<j){
	// 		while(i < j && num[j] >= key){
	// 				j--;
	// 	}
	// 	swap(num,i,j);
	// 	while(i < j && num[i] <= key){
	// 		i++;
	// 	}
	// 	swap(num,i,j);
	                  
	// 	}
	// num[i]= key;
	// quicksort(num,low,j-1);
	// quicksort(num,j+1,high);
	               
    // }
};

这里本来是写个sort就完事,不过这里的数据结构是vector,和数组有点不一样,感觉java下的好写一点?数组下:sort(arr,arr+arr.length()).vector则是上面的写法。sort排序比快排好,因为它会根据情况调用不同的排序方法,快排nlogn.
关于sort源码可以参考以下博客:参考博客1

3.无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串的长度。
在这里插入图片描述

// class Solution {
// public:
//     int lengthOfLongestSubstring(string s) {
//         int l = 0, r = 0; 
//         int maxlen = 0;
        
//         for( ; r < s.size(); r++ ) {
//             for( int k = l; k < r; k++ ) // 检查新元素是否在窗口内出现过
//                 if( s[r] == s[k] ) { // s[r]为新元素
//                     l = k+1;
//                     break; // 重新设置左边界后,就可以检查下一个新元素了
//                 }
//             if(r-l+1 > maxlen)
//                 maxlen = r-l+1;     
//             }
//         return maxlen;
//     }
// };

滑动窗口,右边移动跟左边比较,如果不重复就继续,重复的话要把左边往右边移动再判断一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值