[21] 合并两个有序链表
利用一个pre指针,来不断遍历迭代。利用prehead指针来返回头
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { ListNode *preHead = new ListNode(-1); ListNode *pre ; pre = preHead; while (list1!=nullptr && list2!=nullptr) { if(list1->val < list2->val){ pre->next=list1; list1=list1->next; }else{ pre->next=list2; list2=list2->next; } pre=pre->next; } pre->next = (list1 ==nullptr ? list2:list1); return preHead->next; }
|
[191] 位1的个数
循环遍历累加
1 2 3 4 5 6 7 8 9 10
| int hammingWeight(int n) { int ret=0; for(int i=0;i<32;i++){ if(n&(1<<i)){ ret++; } } return ret; }
|
最优:n&(n-1),做一次这样的运算,即可把最低位的1翻转,做了多少次就有多少1的个数
1 2 3 4 5 6 7 8 9 10
| int hammingWeight(int n) { int ret=0; while (n) { n=n&(n-1); ret++; } return ret; }
|
[9] 回文数
通过除以10来判断余数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| bool isPalindrome(int x) { if(x<10||(x%10==0 && x!=0)){ return false; } int reverNum=0; while(x>reverNum){ reverNum = x%10 + reverNum*10; x = x/10; } if(x==reverNum || x ==reverNum/10){ return true; } return false; }
|
[36]有效的数独
新建三个数组,一个是行数组,计算每行每个数字出现的次数,同理,列数组和小3*3数组,没加入一次,则判断一次时候重复,如果重复则返回false。
原理:利用数组来作为hash表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| bool isValidSudoku(vector<vector<char>>& board) { int row[9][9]; int column[9][9]; int box[3][3][9]; for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ char tmp=board[i][j]; if(tmp!='.') { int index = tmp-'0'-1; row[i][index]++; column[j][index]++; box[i/3][j/3][index]++; if(row[i][index]>1 ||column[j][index]>1||box[i/3][j/3][index]>1){ return false; } } } } return true; }
|
在某些特定情况下,可以用数组来代替哈希表。以下是适合使用数组而不是哈希表的情境:
- 数据索引是连续整数:如果数据的键值是连续的整数(例如0到n),数组可以直接用索引来存取数据,不需要哈希函数的计算。比如在统计字符频率时,字符的ASCII值可以作为数组的索引,直接访问数组元素来存储频率。
- 键的范围已知且较小:当键的范围较小且已知时,可以使用数组代替哈希表。例如,如果键是0到100之间的整数,那么可以创建一个大小为101的数组,以避免哈希冲突,提高存取效率。
- 需要更高的访问速度:数组的直接访问(O(1)时间复杂度)比哈希表的平均访问速度要快,并且没有哈希冲突的风险。如果对访问速度有更高要求且数据范围适合,数组会是更高效的选择。
- 没有删除操作:在某些应用中,如果不涉及数据的删除操作,数组可以更加直接。哈希表需要处理删除的复杂性(例如标记删除),而数组不涉及这种操作。
- 空间复杂度要求低:哈希表在一定的负载因子下可能会占用更多空间,尤其是当数据量少但键范围大时。数组在这种情况下可能更加节省空间,因为可以根据需要创建大小合适的数组。
总结来说,当键是整数、范围较小且已知,并且没有大量动态插入和删除操作的情况下,数组可以作为更高效的替代选择。
[80] 删除有序数组中的重复项 II
双指针查找即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| int removeDuplicates(vector<int>& nums) { int fast =2; int slow =2; int len = nums.size(); if(len<2){s return slow; }
while(fast < len){ if(nums[slow-2]!=nums[fast]){ nums[slow] =nums[fast]; ++slow; } ++fast; } return slow; }
|
一个快指针,一个慢指针