数组
01 day
704. 二分查找
https://leetcode.cn/problems/binary-search/description/
思路分析:
注意查找的边界,target定义的区间 【】(左闭右闭) 【) (左闭右开)
class Solution {
public :
int search(vector<int>& nums, int target){
int left = 0;
int right = nums.size() -1 ;//-----[]
//int right = nums.size() ------[)
while(left <= right){
int middle = left + ((right - left) >> 2);
if(nums[middle] > target){
right = middle -1; //-------[]
//right = middle; ---------[)
}else if(nums[middle] < target){
left = middle + 1;
}else{
return middle;
}
}
return -1;
}
}
27. 移除元素
思路分析 :
暴力求解:两次for循环,等于目标值,则后面元素向前移动
双指针法:快慢指针,一次for循环解决
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size() -1;
for(int i = 0 ;i <= size; i++){
if(nums[i] == val){
for(int j = i+1; j <= size ; j++){
nums[j-1] = nums[j];
}
i--;
size--;
}
]
return size;
}
};
//快慢指针
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for(int fastIndex = 0; fastIndex < nums.size(); fastIndex++){
if(val ! = nums[fastIndex]){
nums[slowIndex++] = nums[fastIndex];
}
//当val = nums[fastIndex]时,slowIndex将不再++,后面再循环时则会覆盖
}
return slowIndex;
}
};
链表
01 day
01—203.移除链表元素
(https://leetcode.cn/problems/remove-linked-list-elements/)
思路分析:
删除节点:让节点的next指针指向下一个节点,(需要找到操作节点的前一个节点)并手动释放这个节点和这块内存
头结点和非头结点
引入虚拟节点(不用分是否为头结点)
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead= new ListNode(0);
ListNode* cur = dummyHead;
while(cur->next != NULL){
if(cur->next->val == val){
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}else{
cur = cur->next;
}
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};
01—707.设计链表
https://leetcode.cn/problems/design-linked-list/
要求:设计一个链表类,实现六个接口
思路分析:
首先定义结构体、
- 初始化链表,头节点为虚拟节点
- get(int index) :判断index是否有效(
index > (size-1) || index <0
)无效,返回-1; - 头插法 创建新节点、插入(
newNode->next = dummyHead->next; dummyHead ->next = newNode
)、大小+1 - 尾插法:循环找到最后一个元素
(while(cur->next != nullptr){ cur = cur ->next;),添加新节点,大小+1
- 插入到指定位置:创建新节点;判断index是否有效
index < 0 || index >size
找到要插入位置的前一个节点,插入新节点newNode->next = cur->next;cur->next = newNode;size++
- 删除指定节点:判断节点位置是否合理;找到要删除节点的前一个位置;删除节点
LinkedNode* tmp = cur->next; cur->next = cur->next->next; delete tmp;size--;
- 打印链表
class MyLinkedLists{
public:
struct LinkedNode(
int val;
LinkedNode* next;
LinkedNode(int val) : val(val),next(nullptr){}
};
MyLinkedList{
dummyHead = new LinkedNode (0);
size = 0;
}
int get( int index){
if(index > (size-1) || index < 0){
return -1;
}
LinkedNode* cur = dummyHead ->next;
while(--index){
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val){
LinkedNode* newNode = new LinkedNode(val);
newNode->next = dummyHead->next;
dummyHead->next = newNode;
size++;
}
void addAddTail(int val){
LinkedNode* newnode = new LinkedNode(val);
LinkedNode* cur = dummyHead;
while(cur->next != nullptr){
cur = cur->next;
}
cur->next = newNode;
size++;
}
void addAtIndex(int index,int val){
if(incdex > size){
return;
}
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = dummyHead;
while(index---){
cur = cur->next;
}
newNode ->next = cur->next;
cur->next = newNode;
size++;
}
void deleteAtIndex(int index){
if(index > (size-1) || index < 0){
return ;
}
LinkedNode*cur = dummyHead;
while(index--){
cur=cur->next;
}
LinkedNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
size--;
}
void printLinkedList(){
LinkedNode* cur = dummyHead;
while(cur->next != nullptr){
cout << cur->netx->val <<" ";
cur = cur->next;
}
cout <<endl;
}
private:
int_size;
LinkedNode* dummyHead;
};
01——206反转链表
[leetcode] (https://leetcode.cn/problems/reverse-linked-list)
思路分析:
双指针法
- 定义一个cur指针指向头节点,再定义一个pre指针,初始化为null
- 首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。
(为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了) - 将cur->next 指向pre ,此时已经反转了第一个节点了。
- cur 指针已经指向了null,循环结束,链表也反转完毕了。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp;
ListNode* cur = head;
ListNode* pre = nullptr;
while(cur){
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};